ExecuteNonQuery 总是 returns -1
ExecuteNonQuery always returns -1
我创建了一个删除记录的存储过程。在此存储过程中,我首先检查要删除的数据的使用情况。如果正在使用,则存储过程将 return -2 否则删除记录。
但问题是即使是记录也存在其 return -1 而不是 -2。我也设置了 NOCOUNT OFF
但不知道问题出在哪里。
我知道这个问题已经通过设置 NOCOUNT OFF
回答了,但它对我不起作用
ALTER PROCEDURE [dbo].[spDeletePIDNumber]
@Id int
AS
BEGIN
SET NOCOUNT OFF;
-- Insert statements for procedure here
if(exists(select * from tblBills where PID = @Id))
begin
return -2
end
else
begin
Delete from HelperPIDNumber
where Id = @Id
end
END
public int DeletePIDNumber(int Id)
{
try
{
int result = 0;
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.connection))
{
var cmd = new SqlCommand("spDeletePIDNumber", conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Id", Id);
conn.Open();
result = cmd.ExecuteNonQuery();
}
return result;
}
catch
{
throw;
}
}
来自 ExecuteNonQuery
文档:
Executes a Transact-SQL statement against the connection and returns the number of rows affected.
在您的程序中有 SET NOCOUNT ON;
明确告诉 SQL 服务器 而不是 到 return 行计数。在这种情况下,ExecuteNonQuery
函数的 return 是 -1。
此外,如果该过程不影响任何行,即使 NOCOUNT
是 OFF
,它也不会 return 行计数。在这种情况下,return 也将为 -1。
您似乎想要做的是获取存储过程的 return value
。您不会从 ExecuteNonQuery
的结果中得到它。请参考 Whosebug 上的这个问题:Getting return value from stored procedure in ADO.NET
通常 ExecuteNonQuery
将 return 条受影响的记录。它会 return -1
在两种情况下:
当SET NOCOUNT ON
已经设置。从你的代码来看,很明显,你有 SET NOCOUNT OFF
所以这不是你的问题。
如果受影响的行数没有,它将 return -1
。在您的情况下,看起来您正在检查一个 table tblBills
中的数据是否存在并从另一个 table HelperPIDNumber
中删除。所以更有可能没有匹配的记录并且没有被删除。
请检查上面的点#2。
if( exists(select * from tblBills where PID = @Id))
begin
return -2
end
else
begin
Delete from HelperPIDNumber where Id = @Id
end
使用 cmd.ExecuteScalar()
而不是 cmd.ExecuteNonQuery()
,因为 cmd.ExecuteNonQuery()
return 只有受影响的行数,而不是您选择的值。
我创建了一个删除记录的存储过程。在此存储过程中,我首先检查要删除的数据的使用情况。如果正在使用,则存储过程将 return -2 否则删除记录。
但问题是即使是记录也存在其 return -1 而不是 -2。我也设置了 NOCOUNT OFF
但不知道问题出在哪里。
我知道这个问题已经通过设置 NOCOUNT OFF
回答了,但它对我不起作用
ALTER PROCEDURE [dbo].[spDeletePIDNumber]
@Id int
AS
BEGIN
SET NOCOUNT OFF;
-- Insert statements for procedure here
if(exists(select * from tblBills where PID = @Id))
begin
return -2
end
else
begin
Delete from HelperPIDNumber
where Id = @Id
end
END
public int DeletePIDNumber(int Id)
{
try
{
int result = 0;
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.connection))
{
var cmd = new SqlCommand("spDeletePIDNumber", conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Id", Id);
conn.Open();
result = cmd.ExecuteNonQuery();
}
return result;
}
catch
{
throw;
}
}
来自 ExecuteNonQuery
文档:
Executes a Transact-SQL statement against the connection and returns the number of rows affected.
在您的程序中有 SET NOCOUNT ON;
明确告诉 SQL 服务器 而不是 到 return 行计数。在这种情况下,ExecuteNonQuery
函数的 return 是 -1。
此外,如果该过程不影响任何行,即使 NOCOUNT
是 OFF
,它也不会 return 行计数。在这种情况下,return 也将为 -1。
您似乎想要做的是获取存储过程的 return value
。您不会从 ExecuteNonQuery
的结果中得到它。请参考 Whosebug 上的这个问题:Getting return value from stored procedure in ADO.NET
通常 ExecuteNonQuery
将 return 条受影响的记录。它会 return -1
在两种情况下:
当
SET NOCOUNT ON
已经设置。从你的代码来看,很明显,你有SET NOCOUNT OFF
所以这不是你的问题。如果受影响的行数没有,它将 return
-1
。在您的情况下,看起来您正在检查一个 tabletblBills
中的数据是否存在并从另一个 tableHelperPIDNumber
中删除。所以更有可能没有匹配的记录并且没有被删除。
请检查上面的点#2。
if( exists(select * from tblBills where PID = @Id))
begin
return -2
end
else
begin
Delete from HelperPIDNumber where Id = @Id
end
使用 cmd.ExecuteScalar()
而不是 cmd.ExecuteNonQuery()
,因为 cmd.ExecuteNonQuery()
return 只有受影响的行数,而不是您选择的值。