-2
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从程序中获得该值。

我必须做出任何改变吗?请注意。

谢谢

4

2 回答 2

1

您已将ParameterDirection设置为Output而不是ReturnValue

  param.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(param);

        cmd.ExecuteNonQuery();

        string budgetnum = (string)cmd.Parameters["@retvalue"].Value;
于 2013-10-10T07:34:47.843 回答
0

当然你需要交换这些行

cmd.ExecuteNonQuery();
string budgetnum = (string)cmd.Parameters["@retvalue"].Value;

先执行再尝试读取返回值

乍一看,如果你想使用ParamDirection.ReturnValue,你需要在你的 SP 的最后一行添加 RETURN 语句,但是,查看关于 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);
于 2013-10-10T07:32:11.473 回答