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.