Dapper的execute方法returns插入和删除的两种不同结果
Dapper's execute method returns two different results for insert and delete
当我将 Dapper 的 Execute 方法用于 INSERT 存储过程时,如果查询成功,它 returns 1 正如预期的那样,但是当我将它用于 DELETE 存储过程时,它 returns -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;
}
您可以尝试像这样构建您的代码。
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
}
Dapper 看不到您的存储过程;在这两种情况下,任何不同之处都特定于这两个命令的内部结构。最终,dapper 只是从 ExecuteCommand
.
返回值
有几件事可能会导致差异:
SET NOCOUNT ON
- 存在
TRIGGER
(包括CASCADE
、SET NULL
等约束/外键子句)
INSERT
/DELETE
之后的附加操作
如果你想从这种类型的操作中获得可靠的值,你应该使用 OUTPUT
或 RETURN
参数,通过 @@ROWCOUNT
.
设置
当我将 Dapper 的 Execute 方法用于 INSERT 存储过程时,如果查询成功,它 returns 1 正如预期的那样,但是当我将它用于 DELETE 存储过程时,它 returns -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;
}
您可以尝试像这样构建您的代码。
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
}
Dapper 看不到您的存储过程;在这两种情况下,任何不同之处都特定于这两个命令的内部结构。最终,dapper 只是从 ExecuteCommand
.
有几件事可能会导致差异:
SET NOCOUNT ON
- 存在
TRIGGER
(包括CASCADE
、SET NULL
等约束/外键子句) INSERT
/DELETE
之后的附加操作
如果你想从这种类型的操作中获得可靠的值,你应该使用 OUTPUT
或 RETURN
参数,通过 @@ROWCOUNT
.