存储过程总是 returns 0,即使里面的过程工作正常
Stored procedure always returns 0, even if the process inside works fine
我正在编写一个用于删除数据的存储过程。只有当没有字段连接到该程序时,它才应该删除该程序。
我的逻辑是先按Id统计TA_Program
相关的列,如果统计到returns0则删除程序,如果returns-3则提示字段连接,以及互联网连接警报。
然而,即使删除过程本身运行良好,存储过程总是 returns 0,所以我总是出现失败警报。
我读了几篇关于 @@ROWCOUNT
、delete
和 ROWCOUNT
之间的关系的帖子,但每次尝试都返回 0,没有别的。你能帮我解决这个问题吗?
这是我的存储过程及其查询方式。
CREATE PROCEDURE SP_Delete_Program_By_Id
(@Id int)
AS
BEGIN
DECLARE @FieldCount AS int
DECLARE @ResultCount AS int
-- count FieldId Where Id = @Id
SELECT @FieldCount = (SELECT COUNT(*) FROM TA_Field (Nolock) WHERE Id = @Id)
-- if no Field is connected, delete program
IF @FieldCount = 0
BEGIN
DELETE FROM TA_Program
WHERE Id = @Id
SELECT @FieldCount = (SELECT COUNT(*) FROM TA_Program (Nolock) WHERE Id = @Id)
IF @FieldCount = 0
SELECT @ResultCount = 1
ELSE
SELECT @ResultCount = -1
END
ELSE
SELECT @ResultCount = -3
RETURN @ResultCount
END
C# 代码:
public static int DeleteProgram(Program obj)
{
int result = -1;
// Sort is for determining db id and pw stored
using (var db = DBConnectionHelper.GetConnection(Sort.Program))
{
var param = new DynamicParameters();
//param.Add("@FieldId", obj.FieldId);
param.Add("@Id", obj.Id, dbType: DbType.Int32);
result = db.Query<int>("APISP_Delete_Program_By_Id", param: param, commandType: CommandType.StoredProcedure).SingleOrDefault<int>();
}
return result;
// this always returns 0
}
[HttpPost]
public APIResult DeleteProgram(string session, Program program)
{
int deleteResult = ProgramsDbHelper.DeleteProgram(program);
if (deleteResult == 1)
{
result.ResultCode = 1;
return result;
}
if (deleteResult == -3)
{
result.ResultCode = -3;
return result;
}
return result;
}
您的程序有很多问题
- 您的主要问题:使用
RETURN
而不是 SELECT
- 应避免使用
NOLOCK
- 应避免使用
sp_
前缀
- 假设
TA_Field
是 TA_Program
的外键,逻辑没有意义:因为你没有交易并且没有使用 HOLDLOCK, UPDLOCK
,另一个可能用户在你的 SELECT COUNT
和 DELETE
之间插入 TA_Program
,此时你会得到一个错误,并且程序的其余部分不会 运行。如果没有人插入那么额外的 SELECT COUNT
就没用了,因为数据没有改变。
- 您实际上不需要任何逻辑,因为您可以将其组合在
DELETE
语句中(无论如何每个语句都在其自己的事务中)。
因此您的程序应该如下所示:
CREATE PROCEDURE Delete_Program_By_Id
(@Id int)
AS
SET NOCOUNT ON;
DELETE FROM TA_Program
WHERE Id = @Id
AND NOT EXISTS (SELECT 1
FROM TA_Field
WHERE Id = @Id);
SELECT CASE WHEN @@ROWCOUNT > 0 THEN 1 ELSE -3 END;
GO
我正在编写一个用于删除数据的存储过程。只有当没有字段连接到该程序时,它才应该删除该程序。
我的逻辑是先按Id统计TA_Program
相关的列,如果统计到returns0则删除程序,如果returns-3则提示字段连接,以及互联网连接警报。
然而,即使删除过程本身运行良好,存储过程总是 returns 0,所以我总是出现失败警报。
我读了几篇关于 @@ROWCOUNT
、delete
和 ROWCOUNT
之间的关系的帖子,但每次尝试都返回 0,没有别的。你能帮我解决这个问题吗?
这是我的存储过程及其查询方式。
CREATE PROCEDURE SP_Delete_Program_By_Id
(@Id int)
AS
BEGIN
DECLARE @FieldCount AS int
DECLARE @ResultCount AS int
-- count FieldId Where Id = @Id
SELECT @FieldCount = (SELECT COUNT(*) FROM TA_Field (Nolock) WHERE Id = @Id)
-- if no Field is connected, delete program
IF @FieldCount = 0
BEGIN
DELETE FROM TA_Program
WHERE Id = @Id
SELECT @FieldCount = (SELECT COUNT(*) FROM TA_Program (Nolock) WHERE Id = @Id)
IF @FieldCount = 0
SELECT @ResultCount = 1
ELSE
SELECT @ResultCount = -1
END
ELSE
SELECT @ResultCount = -3
RETURN @ResultCount
END
C# 代码:
public static int DeleteProgram(Program obj)
{
int result = -1;
// Sort is for determining db id and pw stored
using (var db = DBConnectionHelper.GetConnection(Sort.Program))
{
var param = new DynamicParameters();
//param.Add("@FieldId", obj.FieldId);
param.Add("@Id", obj.Id, dbType: DbType.Int32);
result = db.Query<int>("APISP_Delete_Program_By_Id", param: param, commandType: CommandType.StoredProcedure).SingleOrDefault<int>();
}
return result;
// this always returns 0
}
[HttpPost]
public APIResult DeleteProgram(string session, Program program)
{
int deleteResult = ProgramsDbHelper.DeleteProgram(program);
if (deleteResult == 1)
{
result.ResultCode = 1;
return result;
}
if (deleteResult == -3)
{
result.ResultCode = -3;
return result;
}
return result;
}
您的程序有很多问题
- 您的主要问题:使用
RETURN
而不是SELECT
- 应避免使用
NOLOCK
- 应避免使用
sp_
前缀 - 假设
TA_Field
是TA_Program
的外键,逻辑没有意义:因为你没有交易并且没有使用HOLDLOCK, UPDLOCK
,另一个可能用户在你的SELECT COUNT
和DELETE
之间插入TA_Program
,此时你会得到一个错误,并且程序的其余部分不会 运行。如果没有人插入那么额外的SELECT COUNT
就没用了,因为数据没有改变。 - 您实际上不需要任何逻辑,因为您可以将其组合在
DELETE
语句中(无论如何每个语句都在其自己的事务中)。
因此您的程序应该如下所示:
CREATE PROCEDURE Delete_Program_By_Id
(@Id int)
AS
SET NOCOUNT ON;
DELETE FROM TA_Program
WHERE Id = @Id
AND NOT EXISTS (SELECT 1
FROM TA_Field
WHERE Id = @Id);
SELECT CASE WHEN @@ROWCOUNT > 0 THEN 1 ELSE -3 END;
GO