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

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

最佳答案

我也在寻找从存储过程返回的值并在 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;  
}  

关于c# - 需要从 C# 中的存储过程返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1637646/

相关文章:

sql - 强制转换规范的字符值无效 (#0) - 我知道问题所在,但不知道如何解决

c# - CA1822 在 Release模式下错误地应用于 [TestMethod] 异步任务方法?

.net - 收集有关应用程序使用情况的数据的最佳方法是什么?

.NET ClickOnce 部署和更新版本后调用的错误程序集

.NET 客户端崩溃时将 COM 注册的 .dll 替换为与客户端相同的 .NET 版本中的新 .dll

mysql - 分组和有限查询的随机顺序

java - 如何计算数组列包含元素的行

c# - 在 C# 中测试类型安全枚举模式

c# - 如何配置 NLog 以写入 Azure 应用服务的日志流?

c# - 循环通过 DataAdapter 生成 HTML 表