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 :

pourquoi IExecuteResult.ReturnValue retourne la valeur du return d'une proc stock OU le resultset ?


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut pourquoi IExecuteResult.ReturnValue retourne la valeur du return d'une proc stock OU le resultset ?
    Bonjour,
    J'ai une procédure stockée qui s'écrit comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create procedure sel_toto()
    as
    begin
        if (test_not_good)
            return -1
     
        select col1, col2
        from MyTable
        where MyTable.OID = @OID
     
        return 0
    end
    Si j'exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    declare @ret int
    select @ret = 999
    exec @ret = sel_toto
    select @ret
    Si je ne suis pas dans le cas où test_not_good est validé, j'obtiens bien un resultset avec col1 et col2, puis j'ai bien @ret qui vaut 0.
    Quand je drag&drop cette proc dans mon fichier .dbml, cela génère le code 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.sel_toto")]
    public ISingleResult<sel_totoResult> sel_toto()
    {
    	IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
    	return ((ISingleResult<sel_totoResult>)(result.ReturnValue));
    }
     
     
    public partial class sel_totoResult
    {
    	private int _col1;
    	private string _col2
     
    	public sel_totoResult()
    	{
    	}
    	[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_col1", DbType="Int NOT NULL")]
    	public int col1
    	{
    		get
    		{
    			return this._col1;
    		}
    		set
    		{
    			if ((this._col1 != value))
    			{
    				this._col1 = value;
    			}
    		}
    	}
     
    	[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_col2", DbType="NVarChar(12)")]
    	public string col2
    	{
    		get
    		{
    			return this._col2;
    		}
    		set
    		{
    			if ((this._col2 != value))
    			{
    				this._col2 = value;
    			}
    		}
    	}
    }
    Si je regarde ce que fait ReturnValue, http://msdn.microsoft.com/en-us/libr...vs.100%29.aspx me dit "Gets the return value or result of the executed query". Et tout est dans le OR. Vu ce qu'il crée, il ne pourra jamais stockée a priori la variable du return. Pourquoi est-ce qu'il n'y a pas une variable pour le code retourné par le return et une autre pour le resulset, ça me paraît aberrant. Ca veut dire que le jour où test_not_good est validé, mon appli plante en l'état actuel des choses.
    Est-ce qu'il existe un moyen autre que de ne pas faire de return dans la proc et passer la valeur du return dans un champs output ?
    J'imagine que je ne peux pas non plus modifier le code designer du fichier .dbml pour gérer moi-même les 2 cas possible (un return != 0 ou un resultset) car cela va se faire écraser à la moindre modif de ce dernier.

  2. #2
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    quelqu'un a une idée?

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    L'interface ISingleResult dérive de IFunctionResult, qui permet de récupérer la valeur de retour de la proc stock grâce à la propriété ReturnValue.

    Si tu fais ça :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    using (var ctx = new TonDataContext())
    {
        var data = ctx.TaProcedureStockee();
        var returnValue = (int)data.ReturnValue;
     
        data.ForEach(result =>
            {
                // ...
            };
    }

    Est-ce que tu arrives à récupérer l'ensemble des information (valeur de retour + données) ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    il s'agit de code auto-généré, donc lorsque je fais un drag&drop de ma proc,
    il va de lui-même soit caster la valeur de retour comme ceci s'il détecte un resultset:
    return ((ISingleResult<sel_totoResult>)(result.ReturnValue));
    soit comme ceci s'il ne détecte pas de resultset mais uniquement une valeur de return:
    return ((int)(result.ReturnValue));
    Comme on a accès uniquement à ReturnValue a priori, je ne vois pas comment il peut donner l'info à la fois d'un resultset et à la fois d'une valeur de return, et pourtant on peut faire cela dans une proc stock..

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/02/2010, 22h05
  2. valeur du return dans une "fonction"
    Par Papy214 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/12/2007, 15h53
  3. Réponses: 3
    Dernier message: 04/05/2007, 14h03
  4. Réponses: 9
    Dernier message: 14/10/2005, 18h32
  5. Valeur de retour d'une procédure stockée
    Par Rudyweb dans le forum MFC
    Réponses: 4
    Dernier message: 25/02/2005, 17h52

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