当我使用Dapper的 执行 方法获取 INSERT 存储过程时,如果查询成功运行,则返回 1 < / strong>正如预期的那样,但是当我将它用于 DELETE 存储过程时,它会返回 -1 ,甚至查询也能成功运行。在这种情况下, DELETE 存储过程的成功是“-1”?
public override int Insert(Language entity)
{
var parameters = new DynamicParameters();
parameters.Add("Id", dbType: DbType.Int32, direction: ParameterDirection.Output);
parameters.Add("Name", entity.Name, DbType.String);
parameters.Add("Culture", entity.Culture, DbType.String);
parameters.Add("Published", entity.Published, DbType.Boolean);
parameters.Add("DisplayOrder", entity.DisplayOrder, DbType.Int32);
int numberOfRowsAffected = Connection.Execute("Language_Insert",
parameters, commandType: CommandType.StoredProcedure);
// numberOfRowsAffected = 1
return parameters.Get<int>("Id");
}
public override bool Delete(int primaryKey)
{
var parameters = new DynamicParameters();
parameters.Add("Id", primaryKey, DbType.Int32);
int numberOfRowsAffected = Connection.Execute("Language_Delete",
parameters, commandType: CommandType.StoredProcedure);
// numberOfRowsAffected = -1
return numberOfRowsAffected > 0;
}
答案 0 :(得分:2)
Dapper无法在您的存储过程中看到内容;在这两种情况下不同的任何内容都特定于两个命令的内部。最终,dapper只是从ExecuteCommand
返回值。
有一些因素可能导致差异:
SET NOCOUNT ON
TRIGGER
(包括CASCADE
,SET NULL
等约束/外键条款)INSERT
/ DELETE
如果您需要此类操作的可靠值,则应使用OUTPUT
或RETURN
参数代替,通过@@ROWCOUNT
设置。
答案 1 :(得分:0)
您可以尝试像这样构建代码。
public override bool Delete(int primaryKey)
{
var parameters = new DynamicParameters();
parameters.Add("Id", primaryKey, DbType.Int32);
parameters.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
parameters.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
Connection.Execute("Language_Delete",
parameters, commandType: CommandType.StoredProcedure);
int b = parameters.Get<int>("@b");
// Output
int c = parameters.Get<int>("@c");
// ReturnValue
}