我已经创建了一个用于删除记录的存储过程。在这个存储过程中,我首先检查我要删除的数据的使用情况。如果正在使用它,则存储过程将返回-2,否则它将删除该记录。
但问题是即使记录存在其返回-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;
}
}
答案 0 :(得分:3)
来自ExecuteNonQuery
文档:
对连接执行Transact-SQL语句并返回受影响的行数。
在您的过程中SET NOCOUNT ON;
明确告诉SQL Server 不返回行计数。在这种情况下,ExecuteNonQuery
函数的返回值为-1。
此外,如果该过程不影响任何行,即使NOCOUNT
为OFF
,也不会返回行数。在这种情况下,返回也将是-1。
您似乎想要做的是获取存储过程的return value
。你不会从ExecuteNonQuery
的结果中得到这个。请参阅StackOverflow上的这个问题:Getting return value from stored procedure in ADO.NET
答案 1 :(得分:2)
通常ExecuteNonQuery
将返回受影响记录的数量。它会在两种情况下返回-1
:
设置SET NOCOUNT ON
时。从您的代码中可以清楚地看到,SET NOCOUNT OFF
,所以这不是您的问题。
如果受影响的行数为空,则返回-1
。在您的情况下,看起来您正在检查一个表tblBills
中存在的数据并从另一个表HelperPIDNumber
中删除。因此,没有匹配记录的可能性更大,也没有任何删除。
请检查上面的第2点。
if( exists(select * from tblBills where PID = @Id))
begin
return -2
end
else
begin
Delete from HelperPIDNumber where Id = @Id
end
答案 2 :(得分:0)
使用mHandler = new Handler(Looper.getMainLooper()) {
//your runnable
}
代替cmd.ExecuteScalar()
,cmd.ExecuteNonQuery()
只返回受影响的行数,而不是您选择的值。