Alter procedure budgetno_proc
@wono varchar(max),
@retvalue varchar(max) output
as
begin
declare @budno varchar(max)
if not exists(select * from budgetdet where wono=@wono)
begin
set @budno =LEFT(@wono,13)+'-'+RIGHT('0'+CAST((SELECT ISNULL(MAX(CONVERT(INT,LEFT(@wono,13))),0)+1 from budgetdet WHERE wono=@wono) AS VARCHAR(20)),1)
end
else
begin
set @budno=LEFT(@wono,13)+'-'+'1R'+'-'+RIGHT('000'+CAST((SELECT MAX(CONVERT(INT,SUBSTRING(budno,18,LEN(budno))))+1 from budgetdet WHERE wono=@wono) AS VARCHAR(20)),3)
end
set @retvalue = @budno
end
这是我的输出参数存储过程。
这是我的C#代码:
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["gdb"].ConnectionString);
con.Open();
SqlCommand cmd = new SqlCommand("budgetno_proc", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@wono",Workorder_txt.Text);
SqlParameter param = new SqlParameter("@retvalue", SqlDbType.VarChar,30);
param.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(param);
string budgetnum = (string)cmd.Parameters["@retvalue"].Value;
cmd.ExecuteNonQuery();
con.Close();
我无法从程序中获得@retvalue
值。
我必须做出哪些改变?请注意。
由于
答案 0 :(得分:1)
您已将 ParameterDirection 设置为输出,而不是 ReturnValue
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
string budgetnum = (string)cmd.Parameters["@retvalue"].Value;
答案 1 :(得分:0)
当然你需要交换这些行
cmd.ExecuteNonQuery();
string budgetnum = (string)cmd.Parameters["@retvalue"].Value;
先执行,然后尝试读取返回值
乍一看,如果您想使用ParamDirection.ReturnValue
,您需要将RETURN语句添加为SP的最后一行,但是,查看the page about RETURN语句,您会注意到有关返回的此信息表达
是返回的整数值。存储过程可以返回 调用过程或应用程序的整数值。
所以你不能返回一个字符串。这只留下一个选项
使用ParamDirection.Output
作为@retvalue参数而不是ReturnValue
你还有另外一个问题。如果您期望(或声明)VARCHAR(MAX)的输出参数,则参数的大小不能固定为30个字符。您需要在代码的C#端将大小设置为-1。
所以这些行需要改变
SqlParameter param = new SqlParameter("@retvalue", SqlDbType.VarChar,-1); //<-Size=-1
param.Direction = ParameterDirection.Output; // <- Output
cmd.Parameters.Add(param);