2015-10-14 60 views
1

我现在挣扎了两天:我有一个简单的存储过程插入一行到表中并返回100如果行已经在表和没有插入,或者如果插入成功则为200。返回“返回值”无法正常工作与存储过程中的插入

我一直得到的返回值是100是否存在行并且没有插入完成,或者没有这样的行并且插入被执行。

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

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

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

SO是最好的!

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); 
    } 

(我知道我可以用一个输出参数解决它)

我在想什么......?

+4

评论此行'cmd.Exe cuteNonQuery();'从代码和测试 – wiretext

+1

@tinka抓住它。您正在执行两次存储过程。 – Morpheus

+0

@tinka谢谢!那样做了。我现在编辑我的问题。再次感谢。 – gadi

回答

1

[如@tinka指出,然后编辑成问题]

的原因,返回值总是表明是因为存储过程正在执行两次

cmd.ExecuteNonQuery(); 
int myReturnedCode = (int)cmd.ExecuteScalar(); 
行存在

由于有返回值,我们需要保持呼叫ExecuteScalar()

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