c# - 调用带返回值的存储过程

标签 c# sql-server stored-procedures ado.net return-value

我正在尝试从我的 C# Windows 应用程序调用存储过程。存储过程在 SQL Server 2008 的本地实例上运行。我可以调用存储过程,但无法从存储过程中检索回值。该存储过程应该返回序列中的下一个数字。我在网上做了研究,我看到的所有网站都指出这个解决方案有效。

存储过程代码:

ALTER procedure [dbo].[usp_GetNewSeqVal]
      @SeqName nvarchar(255)
as
begin
      declare @NewSeqVal int
      set NOCOUNT ON
      update AllSequences
      set @NewSeqVal = CurrVal = CurrVal+Incr
      where SeqName = @SeqName

      if @@rowcount = 0 begin
print 'Sequence does not exist'
            return
      end

      return @NewSeqVal
end

调用存储过程的代码:

SqlConnection conn = new SqlConnection(getConnectionString());
conn.Open();

SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter param = new SqlParameter();

param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar);
param.Direction = ParameterDirection.Input;
param.Value = "SeqName";

SqlDataReader reader = cmd.ExecuteReader();

我也尝试过使用 DataSet 来检索具有相同结果的返回值。我缺少什么 我的存储过程的返回值?如果需要更多信息,请告诉我。

最佳答案

您需要在命令中添加一个ReturnValue-direction 参数:

using (SqlConnection conn = new SqlConnection(getConnectionString()))
using (SqlCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = parameterStatement.getQuery();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("SeqName", "SeqNameValue");

    // @ReturnVal could be any name
    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    conn.Open();
    cmd.ExecuteNonQuery();
    var result = returnParameter.Value;
}

将参数的方向设置为 ParameterDirection.ReturnValue 指示 SqlCommand 将其声明为变量并将存储过程的返回值分配给它 (exec @ReturnValue = spMyProcedure...),就像您在 SQL 中编写它一样。

关于c# - 调用带返回值的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465175/

相关文章:

c# - ASP.NET DropDownValue 不会跨 webfarm 中的一台服务器持久保存

c# - 关于应用程序在 XP/W2K3 中没有获得焦点的问题

sql-server - 在 SSMS 中打开同一文件的多个副本

SQL Server : remove character from string variable with CONTAINTABLE and JOIN

sql-server - 寻找测试存储过程的最佳实践?

postgresql - 为什么不能在 PostgreSQL 过程中使用提交和回滚?

sql-server - SQL Server 存储过程中的参数问题

c# - 使用 Linq-to-SQL 从存储过程中检索多个数据

C#全选ListBox中的项目——暂停事件处理

c# - Dotnet-core默认使用2.0框架ubuntu