2014-11-24 158 views
0

我試圖從C#中的存儲過程獲取返回值,但它總是返回{}。我的代碼如下:從存儲過程獲取返回值

SqlCommand cmd = new SqlCommand (); 
cmd.CommandText = "EXEC dbo.verifyEmailDomain @Domain, @RESULT"; 
cmd.Connection = con; 

SqlParameter domain_p = new SqlParameter ("@Domain", SqlDbType.NVarChar); 
domain_p.Value = domain; 
cmd.Parameters.Add (domain_p); 

SqlParameter ret = new SqlParameter("@RESULT", SqlDbType.Int); 
ret.Direction = ParameterDirection.Output; 
cmd.Parameters.Add (ret); 

con.Open (); 
cmd.ExecuteNonQuery (); 
var value = cmd.Parameters ["@RESULT"].Value; 
con.Close (); 

我也試圖設置 「ret.Direction = ParamaterDirection.ReturnValue」 無濟於事

存儲過程如下:

ALTER PROCEDURE [dbo].[verifyEmailDomain] 
    -- Add the parameters for the stored procedure here 
    @Domain nvarchar(200), 
    @RESULT INT OUTPUT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT @RESULT = COUNT(*) 
    FROM Josh.dbo.refDomains 
    WHERE LOWER(EMAIL_DOMAIN)=LOWER(@Domain) 

    RETURN @RESULT 
END 
+2

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2014-11-24 17:04:44

回答

2

如果你可以通過輸出參數調用存儲過程來告訴它:

cmd.CommandText = "EXEC dbo.verifyEmailDomain @Domain, @RESULT OUTPUT"; 

Yo你可以通過指定過程名稱來節省自己的麻煩:

cmd.CommandText = "dbo.verifyEmailDomain"; 
cmd.CommandType = CommandType.StoredProcedure; 
+0

這樣做!有沒有更好的方法來實現這一點? – 2014-11-24 17:07:34

+3

@ joshua-philpott第二種選擇通常是調用存儲過程的方式。 – Jamiec 2014-11-24 17:09:18

1

而不是創建另一個名爲return的變量,爲什麼不只是返回select語句?

ALTER PROCEDURE [dbo].[verifyEmailDomain] 
    -- Add the parameters for the stored procedure here 
    @Domain nvarchar(200), 
AS 
BEGIN 

    SET NOCOUNT ON; 


    RETURN(SELECT COUNT(*) 
    FROM Josh.dbo.refDomains 
    WHERE LOWER(EMAIL_DOMAIN)=LOWER(@Domain)) 
END 

然後更改此代碼:

SqlCommand cmd = new SqlCommand (); 
cmd.CommandText = "EXEC dbo.verifyEmailDomain @Domain, @RESULT"; 
cmd.Connection = con; 

看起來像這樣:

SqlCommand cmd = new SqlCommand (); 
cmd.CommandText = "dbo.verifyEmailDomain"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = con; 

這:

SqlParameter ret = new SqlParameter("@RESULT", SqlDbType.Int); 
ret.Direction = ParameterDirection.Output; 
cmd.Parameters.Add (ret); 

看起來像這樣:

SqlParameter ret = new SqlParameter(); 
ret.Direction = ParameterDirection.ReturnValue; 
ret.ParameterName = "@RESULT"; 
cmd.Parameters.Add(ret); 

在這個時候,你的sql返回@Return的值和返回值都是相同的東西。那種毫無意義的想法:)。

+0

我認爲這絕對是做到這一點的方法。這是我最初做的,但我改變了存儲過程以試圖使其工作。對於任何後來發現此問題的人來說,我認爲問題的實質是確保將CommandType設置爲StoredProcedure,並將參數方向設置爲ParameterDirection.Output或ParameterDirection.ReturnValue(取決於存儲的proc實現) – 2014-11-25 19:22:09