使用存储过程中的 INSERT 返回 "Return Value" 无法正常工作
Returning the "Return Value" not working correct with INSERT in stored procedure
我现在为此苦苦挣扎了两天:我有一个简单的存储过程,可以将一行插入 table 和 return 如果行已经在 [=40 中,则为 100 =] 并且没有完成插入,如果插入成功则返回 200。
我不断得到 return 值 100,无论行是否存在但没有完成插入,或者没有这样的行并且执行了插入。
问题是,如果我从过程中删除 INSERT
行或将其更改为 SELECT
,则 return 值是正确的。 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);
}
(我知道我可以用输出参数解决)
我错过了什么...?
[如@tinka所述,然后编辑到问题中]
return值总是表示行存在的原因是存储过程被执行了两次
cmd.ExecuteNonQuery();
int myReturnedCode = (int)cmd.ExecuteScalar();
因为有return值,我们需要保持对ExecuteScalar()
的调用
//cmd.ExecuteNonQuery();
int myReturnedCode = (int)cmd.ExecuteScalar();
我现在为此苦苦挣扎了两天:我有一个简单的存储过程,可以将一行插入 table 和 return 如果行已经在 [=40 中,则为 100 =] 并且没有完成插入,如果插入成功则返回 200。
我不断得到 return 值 100,无论行是否存在但没有完成插入,或者没有这样的行并且执行了插入。
问题是,如果我从过程中删除 INSERT
行或将其更改为 SELECT
,则 return 值是正确的。 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);
}
(我知道我可以用输出参数解决)
我错过了什么...?
[如@tinka所述,然后编辑到问题中]
return值总是表示行存在的原因是存储过程被执行了两次
cmd.ExecuteNonQuery();
int myReturnedCode = (int)cmd.ExecuteScalar();
因为有return值,我们需要保持对ExecuteScalar()
//cmd.ExecuteNonQuery();
int myReturnedCode = (int)cmd.ExecuteScalar();