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 :

SqlCommand, SqlParameter et paramètres facultatifs


Sujet :

C#

  1. #1
    Membre éclairé
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 421
    Par défaut SqlCommand, SqlParameter et paramètres facultatifs
    Hello,

    je galère avec les SqlParameter...
    En gros, voilà le code :
    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
                    SqlCommand sqlCmdCreeTache = new SqlCommand();
                    sqlCmdCreeTache.CommandType = CommandType.StoredProcedure;
                    sqlCmdCreeTache.CommandText = "[ma_proc]";
                    sqlCmdCreeTache.Connection = ConnexionBD;
                    sqlCmdCreeTache.Transaction = transac;
     
                    SqlParameter sqlPrmGrpId = sqlCmdCreeTache.Parameters.Add("@GRP_ID", SqlDbType.UniqueIdentifier);
                    sqlPrmGrpId.Value = (Guid)new GuidConverter().ConvertFromString("12345678-9123-4567-8901-234567890123");
     
                    SqlParameter sqlPrmCreateur = sqlCmdCreeTache.Parameters.Add("@CREATEUR", SqlDbType.NVarChar);
                    sqlPrmCreateur.Value = LoginOperateur;
     
                    SqlParameter sqlPrmDateCrea = sqlCmdCreeTache.Parameters.Add("@DATE_CREATION", SqlDbType.DateTime);
                    sqlPrmDateCrea.Value = DateTime.Now;
     
                    SqlParameter sqlPrmCodRet = sqlCmdCreeTache.Parameters.Add("@ID", SqlDbType.UniqueIdentifier);
                    sqlPrmCodRet.Direction = ParameterDirection.ReturnValue;
     
                    sqlCmdCreeTache.ExecuteNonQuery();
     
                    id = Convert.ToString(sqlCmdCreeTache.Parameters["@ID"].Value);
    et la proc (je n'ai pas la main dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ALTER PROCEDURE [dbo].[ma_proc]
    	@ID uniqueidentifier OUTPUT,
    	@GRP_ID uniqueidentifier,
    	@CREATEUR varchar(255),
    	@DATE_CREATION datetime
     
    AS
    SET NOCOUNT ON
    SET @ID = NEWID()
    BEGIN
     
    INSERT INTO ...
     
    END
    Et donc 2 questions :
    1) paramètre OUTPUT
    à l'exécution j'ai cette exception : "La procédure ou fonction 'ma_proc' attend le paramètre '@ID', qui n'a pas été fourni."
    Pourquoi fournir une valeur puisqu'il s'agit d'un paramètre de retour ?
    Et surtout, comment ? (un sqlPrmCodRet.Value = ... ne fonctionne pas)
    (PS : et pas besoin de faire un return @ID à la fin de la proc ?)

    2) paramètres facultatifs
    certains paramètres sont facultatifs : y a-t-il un moyen de ne pas renseigner les .Value ? (La procédure ou fonction 'ma_proc' attend le paramètre '@XXX', qui n'a pas été fourni.)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Par défaut
    Bonjour,

    me concernant j'ai a peu prés le même souci. j'utilise un odbccommand auquel je rattache un odbcparameter pour exécuter une procédure stockée. à l'éxecution de mon prog j'ai l'erreur suivante :

    SQLSRV32.DLL, ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]La procédure ou fonction 'sp_MaSProc' attend le paramètre '@MonParam', qui n'a pas été fourni.


    Or, en debug j'arrive a retrouver le parameter dans le command. Et celui ci est du bon type, de la bonne taille et la valeur contenue est cohérente.
    très étrange, si vous pouvez m'éclairer la dessus je pense que ca reglera nos deux soucis en meme temps.

    En revanche pour la question des parametres facultatifs de la procédure stockée, A MA CONNAISSANCE (ce qui est relativement limité dans ce domaine), il me semble qu'il n'y a pas de possibilité de mettre des parametres facultatifs. Ce que j'aurai fais pour contourner le probleme c'est
    - soit de créer une procédure stockée qui utilise n parametres, et une seconde qui en utilise n + x, puis faire appel a l'une ou l'autre selon le besoin
    - soit de revoir ma procédure de facon à ce que tous les parametres envoyés lui soient indispensables.
    ceci dit si de meilleurs idées peuvent etre proposée je reste moi meme a l'écoute.
    merci bien

  3. #3
    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
    Tu dois remplacer
    sqlPrmCodRet.Direction = ParameterDirection.ReturnValue;
    par
    sqlPrmCodRet.Direction = ParameterDirection.Output;

  4. #4
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Citation Envoyé par Peanut Voir le message
    2) paramètres facultatifs
    certains paramètres sont facultatifs : y a-t-il un moyen de ne pas renseigner les .Value ? (La procédure ou fonction 'ma_proc' attend le paramètre '@XXX', qui n'a pas été fourni.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ALTER PROCEDURE [dbo].[ma_proc]
    	@ID uniqueidentifier OUTPUT,
    	@GRP_ID uniqueidentifier ,
    	@CREATEUR varchar(255) = null,
    	@DATE_CREATION datetime
    Il faut seulement que tu instancie ta variable a une valeur quand tu le déclare pour la rendre facultative. Maintenant @Createur est facultatif

  5. #5
    Membre éclairé
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 421
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Tu dois remplacer
    sqlPrmCodRet.Direction = ParameterDirection.ReturnValue;
    par
    sqlPrmCodRet.Direction = ParameterDirection.Output;
    Ah, c'était aussi simple que ça !

    Et en fait c'est quoi la différence pratique entre un OUTPUT et un RETURN ? Enfin ça, c'est une question SQL, pas C#.

  6. #6
    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
    En C# :
    public int f(double d, ref decimal dec, out string s)

    Return, c'est le type de retour de la fonction (ici int)
    Input, c'est les paramètres usuels, non modifiables par la fonction (ici double)
    InputOutput, c'est les paramètres lus et modifiables par la fonction (decimal)
    Output, c'est les paramètres de sortie, utilsés quand on veut que la fonction revoie plus qu'une seule valeur (ici string).

  7. #7
    Membre éclairé
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 421
    Par défaut
    Citation Envoyé par shwin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ALTER PROCEDURE [dbo].[ma_proc]
    	@ID uniqueidentifier OUTPUT,
    	@GRP_ID uniqueidentifier ,
    	@CREATEUR varchar(255) = null,
    	@DATE_CREATION datetime
    Il faut seulement que tu instancie ta variable a une valeur quand tu le déclare pour la rendre facultative. Maintenant @Createur est facultatif
    OK. Malheureusement je ne peux pas modifier la proc.
    Donc je vais être obliger de passer ces paramètres "par défaut" à l'appel.

    Comment est-ce qu'on passe un SQLParam.Value = "null" en C# ? (guid, varchar, datetime)

    Edit :
    apparemment c'est :
    - guid : Guid.Empty
    - varchar : string.Empty
    - datetime : ?

  8. #8
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Param.Value = Convert.DbNull

  9. #9
    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
    Citation Envoyé par Peanut Voir le message
    apparemment c'est :
    - guid : Guid.Empty
    - varchar : string.Empty
    - datetime : ?
    Oulala malheureux non ! string.Empty et null n'ont rien à voir ! L'un est la chaîne vide ; l'autre est "null", l'absence de valeur.

    Tu peux donc spécifier comme valeur DBNull.Value, qui est un objet spécial servant aux classes de BDD à indiquer la valeur "null" de base.

    Ca doit dépendre des bases et des fournisseurs d'accès aux données, mais du moins en ODP, un joli leParam.Value = null marche impec.

  10. #10
    Membre éclairé
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 421
    Par défaut
    Merci à tous, ça marche avec Convert.DbNull.

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

Discussions similaires

  1. Rendre un paramètre facultatif
    Par rvzip64 dans le forum Delphi
    Réponses: 8
    Dernier message: 07/06/2018, 12h05
  2. [Web Service][SOAP] nusoap : définir paramètres facultatif
    Par Florent08800 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 11/01/2007, 16h21
  3. Paramètres facultatifs dans une fonction
    Par eric41 dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2006, 13h54
  4. [VB6]Paramètre facultatif pour un objet Command
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/04/2006, 01h40
  5. [Sybase] paramètre facultatif pour procédure stockée
    Par MashiMaro dans le forum Sybase
    Réponses: 6
    Dernier message: 15/12/2004, 15h14

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