【问题标题】:C# to read OUTPUT value from stored procedure [duplicate]C#从存储过程中读取输出值[重复]
【发布时间】:2019-04-08 20:03:47
【问题描述】:

我一直试图从我的存储过程中读取 RETURN 值一段时间,但没有成功,在我之前的帖子中有人指出我应该使用 OUTPUT 并且有人提供了一些关于我将如何做的代码因为我以前没有使用过OUTPUT

我现在正尝试将 OUTPUT 值放入我的 C# 代码中。

  • 如果投票不存在则返回 0
  • 如果投票存在则返回 1

代码当前抛出错误:

System.Data.SqlClient.SqlException:过程或函数“投票”需要参数“@votecount”,但未提供该参数

我在这里和谷歌上查看了很多帖子,但没有找到我的答案,所以希望这里的人能帮助我解决我哪里出错了

我的 C#

command = new SqlCommand($@"EXECUTE dbo.Votes @VotedMember = @@VotedMember,
                                              @VotedBy = @@VotedBy",  
                         StaticObjects._connection);

if (Context.Guild.Users.Where(x => x.Username.ToLower() == member.ToLower() || 
                                   x.Nickname?.ToLower() == member.ToLower()).Count() > 0)
{
    SqlParameter GOTWParam = new SqlParameter
    {
         ParameterName = "@@VotedMember",
         Value = //code here
    }

    command.Parameters.Add(GOTWParam);

    SqlParameter VotedByParam = new SqlParameter
    {
        ParameterName = "@@VotedBy",
        Value = //code here
    };
    command.Parameters.Add(VotedByParam);
    command.Parameters.Add("@votecount", SqlDbType.Int).Direction = ParameterDirection.Output;

    command.ExecuteNonQuery();

    int response = Convert.ToInt32(command.Parameters["@votecount"].Value);

    switch (response)
    {
        case 0:
           // do something

        case 1:
           // do something
    }
}

存储过程

CREATE PROCEDURE [dbo].[Votes]
    @VotedMember BIGINT,
    @VotedBy BIGINT,
    @votecount INT OUTPUT

    AS

    BEGIN TRY
    BEGIN TRANSACTION t_Transaction

    SET @votecount = 0
    IF NOT EXISTS(SELECT 1 FROM [dbo].[GOTWVotes] 
    WHERE [VotedBy] = @VotedBy)
    BEGIN
        INSERT INTO 
        [dbo].[GOTWVotes] ([VotedMember],[VotedBy])
    VALUES
        (@VotedMember, @VotedBy)        
    END
    ELSE
    BEGIN
        SELECT @votecount = COUNT(*) FROM [dbo].[GOTWVotes] 
    WHERE [VotedBy] = @VotedBy
    END


    COMMIT TRANSACTION t_Transaction
    END TRY
    BEGIN CATCH
        SET @votecount = -1
        ROLLBACK TRANSACTION t_Transaction
    END CATCH

【问题讨论】:

  • 代替ParameterDirection.Output,试试ParameterDirection.ReturnValue
  • 你的 SP 定义是什么样的?

标签: c# sql-server stored-procedures discord


【解决方案1】:

您缺少一个输出参数。

TSQL 看起来像:

command = new SqlCommand($@"EXECUTE dbo.Votes @VotedMember = @p_VotedMember,
                                              @VotedBy = @p_VotedBy,
                                              @p_votecount = @votecount output",  
                         StaticObjects._connection);

在 C# 中

var pVotecount = command.Parameters.Add("@p_votecount", SqlDbType.Int);
pVotecount.Direction = ParameterDirection.Output;

其中@p_ 是与存储过程参数名称不同的参数名称。

如果使用存储过程返回值(不是最佳实践),调用将如下所示:

command = new SqlCommand($@"EXECUTE @p_votecount = dbo.Votes @VotedMember = @p_VotedMember,
                                              @VotedBy = @p_VotedBy",  
                         StaticObjects._connection);

在这两种情况下,@p_votecount 应该是 ParameterDirection.Output 而不是 ParameterDirection.ReturnValue。 ReturnValue 仅与 CommandType.StoredProcedure 一起使用。

【讨论】:

  • 我现在在原始帖子中包含了我正在使用的 SP,并且我已经在使用 ParameterDirection.Output?,所以我目前得到的 @@VotedMember 是错误的?
  • 使用@@ 不是常见的做法,但这不是问题。问题是输出参数没有出现在您的 SqlCommand.CommandText 中。
  • 只是想检查一下它以前一直有效,所以我已经按照我之前尝试过的建议更新了 SqlCommand,这会引发错误System.Data.SqlClient.SqlException: Must declare the scalar variable "@@votecount". 我认为这是因为我只是通过了@@VotedMember@@VotedBy 的参数但是我不确定 @@votecount 的参数是什么
  • SQL 认为 @@votecount 是一个局部变量,因为您没有绑定具有该名称的参数。
  • 好的,如果我使用command.Parameters.Add("@votecount", SqlDbType.Int).Direction = ParameterDirection.Output 作为该参数的值?很抱歉在这个问题上挣扎
猜你喜欢
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多