【问题标题】:Need a return value from a stored procedure in C#需要 C# 中存储过程的返回值
【发布时间】:2009-10-28 14:33:24
【问题描述】:

在 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# 中返回存储过程的结果?

【问题讨论】:

    标签: c# .net sql stored-procedures


    【解决方案1】:

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

    我根据代码中的逻辑返回了各种返回代码,而 executescalar 将无济于事,因为我想使用适当的代码从存储过程中返回,而不是使用 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;  
    }  
    

    【讨论】:

    • 请注意参数名称是任意的,关键是方向是ReturnValue。对于具有 ReturnValue 方向的命令,您只能有一个参数。另请注意,参数名称与为此命令声明的任何现有参数都不匹配。
    【解决方案2】:

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

    【讨论】:

    • 简单的东西,这就是我想要的。您还必须转换为您想要的类型,在这种情况下它是一个字符串。
    • 是的,这是迄今为止最简单的答案。
    • 此方法不适用于返回值而不是输出值或返回行的存储过程。有关返回值,请参见 user_v 的答案。
    • 我同意 Josh,这是一个仅适用于特定查询的解决方案,不适合作为 OP 问题的一般解决方案。使用 @user_v 记录的具有 Direction = ReturnValue 的参数是一种通用解决方案。
    【解决方案3】:

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

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

    **编辑:**
    正如 Ryan Brunner 在 cmets 中所说,您必须在存储过程中将您的参数标记为 OUT 才能工作。

    【讨论】:

    • 为了使其工作,@UserID 也需要在存储过程中标记为输出参数。
    • 啊,是的,你是对的。 @Chris Ballance,如果您采用这种方法,请听从 Ryan 的建议!我会编辑。
    • +1 为您的帖子和社区提供更好的帖子
    【解决方案4】:

    您也可以使用输出参数。

    在存储过程中:

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

    在代码中:

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

    【讨论】:

    • 这将涉及更改存储过程本身,使用 System.Data.ParameterDirection.ReturnValue 的方向向命令添加参数是您从存储过程中捕获返回值所需要做的一切。
    【解决方案5】:

    您也可以使用输出参数。

    【讨论】:

      【解决方案6】:

      使用...?

      Linq2实体?将 sproc 拖入设计器中,它将成为 c# 中的一个函数,返回正确的值。 Linq2Sql?将 sproc 拖入设计器中,它将成为 c# 中的一个函数,返回正确的值。 阿多? - 只需将 ExecuteScalar 的结果分配给变量

      【讨论】:

      • @Russell,这就是标签的用途,它们清楚地表明他正在使用 SQL C# 及其 SQL 中的存储过程。
      • JonH - 这些都是在 C# 中使用 SQL 执行此操作的有效方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多