ЭстЪ StoredProcedure
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create procedure sp_SalaryMaxListWReturn_Output
@MaxCount int,
@RC int output
as
begin
declare
@tmpString varchar( 256 )
select Name, Salary
from Staff S
where (select count(distinct Salary)
from Staff
where Salary > S.Salary
) < @MaxCount
order by Salary desc
set @RC=@@rowcount
set @tmpString='@@rowcount='||convert(varchar( 256 ),@RC)
print @tmpString
return(@RC)
end
При запуске
1.
2.
3.
4.
5.
6.
7.
8.
declare
@c int,
@r int,
@s varchar( 256 )
exec @r=sp_SalaryMaxListWReturn_Output 3 , @c output
set @s='@r='||convert(varchar( 256 ),@r)||' @c='||convert(varchar( 256 ),@c)
print @s
видно, что возвращается два рекордсета: 1-й - сам select, 2-й - output параметр
Вот теперь это все добро нуна поднять.
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.
cmd.CommandType=CommandType.Text;
cmd.CommandText="{? = call sp_SalaryMaxListWReturn_Output(?, ?)}";
cmd.Parameters.Clear();
SPRetValue=cmd.Parameters.Add("@return",OleDbType.Integer);
SPRetValue.Direction=ParameterDirection.ReturnValue;
cmd.Parameters.Add("@MaxCount",OleDbType.Integer).Value= 3 ;
SPResult=cmd.Parameters.Add("@RC",OleDbType.Integer);
SPResult.Direction=ParameterDirection.Output;
rdr=cmd.ExecuteReader();
RetValue=Convert.ToInt32(cmd.Parameters["@return"].Value);
Res=Convert.ToInt32(SPResult.Value);
do
{
if(rdr.HasRows)
{
Res= 0 ;
while(rdr.Read())
++Res;
}
}while(rdr.NextResult());
rdr.Close();
// ||
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="sp_SalaryMaxListWReturn_Output";
OleDbCommandBuilder.DeriveParameters(cmd);
cmd.Parameters["MaxCount"].Value= 4 ;
rdr=cmd.ExecuteReader();
RetValue=Convert.ToInt32(cmd.Parameters["RETURN_VALUE"].Value);
Res=Convert.ToInt32(cmd.Parameters["RC"].Value);
do
{
if(rdr.HasRows)
{
Res= 0 ;
while(rdr.Read())
++Res;
}
}while(rdr.NextResult());
rdr.Close();
возвращает только один рекордсет и при этом RETURN_VALUE && output параметр - null
Что где ышо нуна покрутить/подкрутить/пнуть чтобы забегало?
P.S. Самое интересное, что
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
cmd.CommandType=CommandType.Text;
cmd.CommandText="{? = call sp_SalaryMaxListWReturn_Output(?, ?)}";
cmd.Parameters.Clear();
SPRetValue=cmd.Parameters.Add("@return",OleDbType.Integer);
SPRetValue.Direction=ParameterDirection.ReturnValue;
cmd.Parameters.Add("@MaxCount",OleDbType.Integer).Value= 3 ;
SPResult=cmd.Parameters.Add("@RC",OleDbType.Integer);
SPResult.Direction=ParameterDirection.Output;
da.SelectCommand=cmd;
tbl.Reset();
da.Fill(tbl);
RetValue=Convert.ToInt32(cmd.Parameters["@return"].Value);
Res=Convert.ToInt32(SPResult.Value);
// ||
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="sp_SalaryMaxListWReturn_Output";
OleDbCommandBuilder.DeriveParameters(cmd);
cmd.Parameters["MaxCount"].Value= 4 ;
da.SelectCommand=cmd;
tbl.Reset();
da.Fill(tbl);
RetValue=Convert.ToInt32(cmd.Parameters["RETURN_VALUE"].Value);
Res=Convert.ToInt32(cmd.Parameters["RC"].Value);
отрабатывает как нужно
_________________
"Helo, word!" - 17 errors 56 warnings