【问题标题】:Returning the "Return Value" not working correct with INSERT in stored procedure在存储过程中使用 INSERT 返回“返回值”不正确
【发布时间】:2016-01-12 22:42:06
【问题描述】:

我已经为此苦苦挣扎了两天:我有一个简单的存储过程,可以在表中插入一行,如果行已经在表中并且没有插入,则返回 100,如果插入成功,则返回 200 .

无论行是否存在并且没有插入完成,或者没有这样的行并且插入已执行,我都会得到 100 的返回值。

问题是,如果我从过程中删除INSERT 行或将其更改为SELECT,则返回值是正确的。 IE。 INSERT 是罪魁祸首。

这是一个带有 SQL Server Express 的 .NET C# Windows 应用程序。

编辑:正如@tinka 所说(请参阅下面的评论),我所要做的就是注释掉cmd.ExecuteNonQuery(); 行,现在一切都很酷。

所以是最好的!!!

ALTER PROC [dbo].[spTEST]
   @Input_For_SP NVARCHAR(10)
AS
BEGIN
    DECLARE @Count INT
    DECLARE @ReturnCode INT

    SELECT @Count = COUNT(Test_Name) 
    FROM tblTest 
    WHERE Test_Name = @Input_For_SP

    IF @Count > 0 
        SET @ReturnCode = 100
    ELSE
    BEGIN 
        SET @ReturnCode = 200

        INSERT INTO tblTest(Test_Name) VALUES (@Input_For_SP)
    END

    SELECT @ReturnCode AS ReturnValue
END

在我的 Winform 中我有:

    private void button4_Click(object sender, EventArgs e)
    {
        string myTEST4_Result;
        myTEST4_Result = execute_spTEST4(textBox4.Text);
        MessageBox.Show(myTEST4_Result);
    }

    static string execute_spTEST4(string mytextBox4)
    {
        string conStr = ConfigurationManager.ConnectionStrings["MY_TEST_DATABASE"].ToString();
        SqlConnection conn = new SqlConnection(conStr);
        SqlCommand cmd = new SqlCommand("spTEST", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Input_For_SP", mytextBox4);
        conn.Open();
        //cmd.ExecuteNonQuery();                            THIS LINE WAS THE CULPRIT!!!!
        int myReturnedCode = (int)cmd.ExecuteScalar();
        string my_test4_result = myReturnedCode.ToString();
        return (my_test4_result);
    }

(我知道我可以用 OUTPUT 参数解决)

我错过了什么...?

【问题讨论】:

  • 从代码和测试中评论这一行cmd.ExecuteNonQuery();
  • @tinka 抓住了它。您正在执行存储过程两次。
  • @tinka 谢谢!做到了。我现在将编辑我的问题。再次感谢。
  • @gadi 尝试使用RETURN @ReturnCode AS ReturnValue 而不是SELECT @ReturnCode AS ReturnValue
  • @tinka 将 SELECT 更改为 Return 会在 AS 处引发语法错误,因此我将其保留为 SELECT。不管怎样,你之前的想法已经解决了我的问题。

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


【解决方案1】:

[如@tinka 所述,然后编辑到问题中]

返回值总是表示行存在的原因是存储过程执行了两次

cmd.ExecuteNonQuery();
int myReturnedCode = (int)cmd.ExecuteScalar();

既然有返回值,我们需要保持对ExecuteScalar()的调用

//cmd.ExecuteNonQuery();
int myReturnedCode = (int)cmd.ExecuteScalar();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多