需要C#中存储过程的返回值

时间:2009-10-28 14:33:25

标签: c# .net sql stored-procedures

使用SQL Server 2005中的以下存储过程

IF OBJECT_ID('[dbo].[UserProfile]') IS NOT NULL

DROP PROCEDURE [dbo].[UserProfile]  

GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

CREATE PROCEDURE [dbo].[UserProfile] 
(      
      @UserId VARCHAR(20)
)

AS

IF @UserId = 'userId'
BEGIN
SELECT @UserId = 'Yes'
END

ELSE
SELECT @UserId = 'No'

  SELECT @UserId AS RESULT 

  RETURN RESULT

GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

C#代码,需要获取存储过程的结果

public String UserProfile(string userId)
{
   String result;
   System.Data.Common.DbCommand cmd = this.mConn.CreateCommand();

   try
   {

       cmd.CommandTimeout = this.mCmdTimeout;
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.CommandText = "UserProfile";

       DbParameter p = cmd.CreateParameter();

       p.ParameterName = "@UserId";
       p.DbType = DbType.String;
       p.Value = userId;

       cmd.Parameters.Add(p);

       cmd.Connection.Open();
       cmd.ExecuteNonQuery();
       cmd.Connection.Close();

       //Need to assign the value of the stored procedure's return to result
       result = Convert.ToString(cmd.Parameters["@UserId"].Value);
   }
   catch (Exception ex)
   {
       throw;
   }
   finally
   {
       cmd.Connection.Close();
   }

   return result;
}

如何在C#中返回存储过程的结果?

6 个答案:

答案 0 :(得分:7)

我也在寻找Stored过程中的返回值并用C#捕获它。

我根据代码中的逻辑返回了各种返回代码,并且performcalar将无法帮助,因为我想在适当的代码所需的任何地方之间退出存储过程,而不是使用select。 因此,通过添加带有Direction作为ReturnValue的额外参数,您可以捕获返回值。无需OUT参数来捕获存储过程中的返回值。

       preturn.ParameterName = "@Return_Value";  
       preturn.DbType = DbType.Int;        
       preturn.Direction = ParameterDirection.ReturnValue;

所以这就是我想出来的。编辑本文中的原始代码以保持简单。

public String UserProfile(string userId)  
{  
   String result;  
   System.Data.Common.DbCommand cmd = this.mConn.CreateCommand();  

   try  
   {  

       cmd.CommandTimeout = this.mCmdTimeout;  
       cmd.CommandType = CommandType.StoredProcedure;  
       cmd.CommandText = "UserProfile";  

       DbParameter p = cmd.CreateParameter();  

       p.ParameterName = "@UserId";  
       p.DbType = DbType.String;  
       p.Value = userId;  

       cmd.Parameters.Add(p);  

       DbParameter preturn = cmd.CreateParameter();        
       preturn.ParameterName = "@Return_Value";  
       preturn.DbType = DbType.Int;        
       preturn.Direction = ParameterDirection.ReturnValue;

       cmd.Parameters.Add(preturn);  

       cmd.Connection.Open();  
       cmd.ExecuteNonQuery();  
       cmd.Connection.Close();  

       //Need to assign the value of the stored procedure's return to result  
       result = Convert.ToString(cmd.Parameters["@Return_Value"].Value);  
   }  
   catch (Exception ex)  
   {  
       throw;  
   }  
   finally  
   {  
       cmd.Connection.Close();  
   }  

   return result;  
}  

答案 1 :(得分:6)

在这种情况下,您可以使用Command的ExecuteScalar()方法返回值。 ExecuteScalar将查看从数据库返回的第一条记录的第一列。

答案 2 :(得分:4)

在执行命令之前,尝试将其添加到参数的属性中:

cmd.Parameters["@UserId"].Direction = System.Data.ParameterDirection.InputOutput;

**编辑:**
正如Ryan Brunner在评论中所述,您必须在存储过程中将参数标记为OUT才能使其生效。

答案 3 :(得分:3)

您也可以使用输出参数。

在storedprocedure中:

CREATE PROCEDURE [dbo].[UserProfile] 
(      
      @UserId VARCHAR(20) Output
)

在代码中:

p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Direction = System.Data.ParameterDirection.Output;
p.Value = userId;

答案 4 :(得分:1)

您也可以使用输出参数。

答案 5 :(得分:-1)

使用...

Linq2Entities?将sproc拖到设计器中它将是c#中返回正确值的函数。 LINQ2SQL?将sproc拖到设计器中它将是c#中返回正确值的函数。 ADO? - 只需将ExecuteScalar的结果赋值给变量