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#

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

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

    je travaille actuellement sur une appli c# lié à une base SQLServer2000, cependant j'ai du codé l'accès aux données avec une DAC (merci à ce tuto au passage : http://ditch.developpez.com/dotnet/factories/).
    Depuis, pour faire mes requètes parametrés, j'ai été obligé de faire cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void AddParam(IDbCommand cmd, string nameParam, DbType typeParam, int sizeParam)
            {
                IDbDataParameter result = cmd.CreateParameter();
                result.DbType = typeParam;
                result.Size = sizeParam;
                result.ParameterName = nameParam;
                cmd.Parameters.Add(result);
            }
    Mon problème, c'est que je ne comptais pas renseigner un paramètre "sizeParam", mais le compilateur m'y a contraint...
    Ce qui fait que pour renseigner un paramètre de requète de type varchar(50), et que le type Varchar n'est pas reconnu par System.data.dbType, je me retrouver a utliser ma fonction de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddParam(cmdNonQuery, "@un_nom_de_param", DbType.String, ???);
    Mon problème est simple : qu'elle est la valeur de sizeParam la mieux approprié (je doute que ce soit 50, varchar ne doit pas ètre la même chose que string)? et aurais-je des problèmes avec ma méthode si je change de SGBD?

    merci à vous, n'hésitez pas à me reprendre si j'ai pas été assez clair
    (sachant que par la suite je vous demanderais la même chose pour tout les types important: byte, float, double, int32, int64, char... ^^)

  2. #2
    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 thelpi Voir le message
    Mon problème, c'est que je ne comptais pas renseigner un paramètre "sizeParam", mais le compilateur m'y a contraint...
    Tu peux préciser ? Pour les paramètres input, je n'ai jamais eu besoin de spécifier de taille, les dll d'accès se débrouillent très bien sans.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    au moment ou je prépare mon objet commande, si je met pas de paramètre size, j'ai "La méthode SqlCommand.Prepare requiert que tous les paramètres de longueur variable aient une valeur Size explicitement définie différente de zéro."

  4. #4
    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
    Mais là, tu ne spécifies pas de valeur à tes paramètres... Ce sont bien des Input ?

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    non je ne spécifie pas de valeurs, vu que j'utilise, pour une requete parametré, la méthode AddParam(...) une suel fois, en tout début de code, je prépare la requète, et plus tard j'utilise autant de fois que nécéssaire une méthode AddValue(nom de la commande, nom du paramètre a renseigner, valeur du paramètre)... ça répond à ta question? (je n'ai jamais utilisé Input, je suis donc pas sur d'avoir tout bien compris)

    merci de m'aider

  6. #6
    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
    Ah ok. J'ai pas le souci parce que je recrée une commande en filant directement les valeurs des paramètres (je bosse avec ODP sur une base Oracle).
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmd.Parameters.Add("ID", 9);
    cmd.Parameters.Add("Nom", "Bob");
    Si on en croit la MSDN http://msdn.microsoft.com/en-us/libr...d.prepare.aspx, l'utilisation de la méthode Prepare semble nécessiter de donner des tailles aux paramètres. As-tu vraiment besoin de faire "Prepare" avant d'exécuter ta requête ?

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Désolé de répondre si tard, j'attendais d'ètre a nouveau au boulot

    En fait, j'ai un grand nombre d'Insert (ou d'Update suivant le cas) à réaliser (variant entre 300 et 100000), les valeurs à insérer proviennent d"un select, j'exécute ma requète sur chaque ligne du DataReader.
    Je gagne beaucoup de temps à préparer ma requète en début de programme et de en lui passant mes valeurs au dernier moment à chaque tour de boucle.

    Donc voila, au cours de la préparation, je me retrouve à renseigner un champ size qui est tout sauf clair, surtout pour les varchar. Ce n'est pas urgent vu que ça marche en mettant n'importe quel nombre assez grand, mais je préfererais coller au mieux à la base.

    merci.

  8. #8
    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 thelpi Voir le message
    Donc voila, au cours de la préparation, je me retrouve à renseigner un champ size qui est tout sauf clair, surtout pour les varchar. Ce n'est pas urgent vu que ça marche en mettant n'importe quel nombre assez grand, mais je préfererais coller au mieux à la base.

    merci.
    Ok ok ok, je vois mieux Tu peux mettre la taille de la colonne de base, par exemple.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    en fait c'est ce que je fait actuellement, mais je doute que ce soit la même unité : le paramètre size est en octet (enfin byte d'après le MSDN), en SQL server je croit qu'ils sont en bits.
    Pour un varchar de 75, je devrais donc mettre "9,375" en param? ...

  10. #10
    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
    Oui mais ta colonne de base de donnée, elle a bien une taille exprimée en nombres de caractères, non ? Je sais pas comment c'est en SQL server ; en orcale, c'est du style (VARCHAR2 500) ce qui signifie que la colonne contient des chaînes d'au max 500 caractères par exemple.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Je ne sait pas en fait comment fonctionne la taille des champs dans SqlServer :
    "en SQL server je croit qu'ils sont en bits." => en fait j'en sait rien du tout ! :d

    mais si c'est en nombre de caractères, ça ne change pas mon problème, je dirais même que ça empire, ou alors y'a un truc que je ne saisi pas : comment définir une taille en octet sous C# pour correspondre a une taille en nombre de caractères sous SqlServer? [pour les valeurs numériques, à bien réfléchir je ne sait pas non plus comment ça fonctionne]

  12. #12
    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 thelpi Voir le message
    comment définir une taille en octet sous C#
    C'est là que tu te trompes ; la taille n'est pas en octet.

    Une colonne de base de donnée a une taille, définie au moment de la création de la table qui la contient. Si c'est un type de base, on s'en fout. Si c'est un type de taille variable (comme le texte), il faut le spécifier au moment de la création de la colonne.

    Donc utilise ton outil de visualisation de la base (je ne sais pas comment ça s'appelle en sqlserver), regarde les propriétés de ta colonne de type texte, et colle tell quelle le champ "size" que tu y trouveras dans le "Size" de ton SqlParameter côté C#.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Voila ce que j'avais lu :
    http://msdn.microsoft.com/en-us/libr...eter.size.aspx

    "Property Value
    Type: System..::.Int32
    The maximum size, in BYTES, of the data within the column. The default value is inferred from the the parameter value."

    je maintient donc que j'ai un problème rien d'important mais je me répète je veux coller au mieux à la base et la j'ai l'impression que ce n'est pas le cas

  14. #14
    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
    En effet. contre-attaque !
    http://msdn.microsoft.com/en-us/libr...eter.size.aspx

    C'est bien cette classe que tu utilises ? Il est écrit que
    The Size property is used for binary and string types. For parameters of type SqlType.String, Size means length in Unicode characters.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    ok, en fait c'est le dataprovider qui utilise la classe que tu m'as montré quand il a détecté le type de fournisseur de données.
    En gros, je doit bien mettre la longueur de chaine en paramètre, tu avais raison, mais je redevient dépendant du SGBD, enfin j'ai pas été voir la propriété size pour les autres SGBD, c'est peut ètre pareil...

    pour les numériques, je ne sait pas trop ce que ça donne non plus:
    exemple :
    dans ma base j'ai un champ int, taille 4
    dans mon code c#, j'ai un dbtype.int32, size = 4

    j'ai bon?

  16. #16
    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 thelpi Voir le message
    j'ai bon?
    Moui. Je re-cite le lien de tout à l'heure :
    The Size property is used for binary and string types.
    La doc d'ODP (pour Oracle) dit :
    The value of Size is handled as follows:
    ■ Fixed length data types: ignored
    Donc : tu n'as à considérer la taille que pour les chaînes de caractères (et les tableaux / Lobs en oracle, mais pas dans ton cas).

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    ok, j'ai pigé, il faut me traduire les phrases en français pasque j'ai nu peu de mal c'est tout

    merci du coup de main!

+ 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: 9
    Dernier message: 09/07/2008, 18h39
  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