2014-11-24 162 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