2013-10-10 154 views
-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 [email protected]) 
    begin 
     set @budno =LEFT(@wono,13)+'-'+RIGHT('0'+CAST((SELECT ISNULL(MAX(CONVERT(INT,LEFT(@wono,13))),0)+1 from budgetdet WHERE [email protected]) 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 [email protected]) 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

當參數返回它顯示錯誤值未通過msg.when我把它設置爲輸出,它什麼都沒顯示 – Gopi

回答

1

您已設置ParameterDirection輸出,而不是返回值

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

     cmd.ExecuteNonQuery(); 

     string budgetnum = (string)cmd.Parameters["@retvalue"].Value; 
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); 
相關問題