我正在尝试这样的事情:
using (var db = new Database(ConnectionString, DataProvider))
{
var spResult =
db.Execute("exec [cmtUpdateOrganization] @Id,@FullName",
new
{
organizatonData.Id,
organizatonData.FullName
}
);
if (spResult == 0 || spResult == 1)
return true;
return false;
}
但似乎spResult总是-1。
虽然在存储过程中,它肯定会返回0.我在sql server本身上使用相同的参数进行了验证。
输出参数工作正常,但这不是我喜欢做的,因为它涉及更改大量存储过程。
答案 0 :(得分:3)
PetaPoco中的Execute方法只是从SqlCommand对象调用ExecuteNonQuery()方法。
这就是为什么你要返回-1的原因,它直接来自MSDN。
引自MSDN
您可以使用ExecuteNonQuery执行目录操作(for 例如,查询数据库的结构或创建数据库 诸如表之类的对象,或者在没有的情况下更改数据库中的数据 通过执行UPDATE,INSERT或DELETE语句来使用DataSet。
虽然ExecuteNonQuery没有返回任何行,但任何输出参数或 映射到参数的返回值将填充数据。
对于UPDATE,INSERT和DELETE语句,返回值为 受命令影响的行数。当a上存在触发器时 正在插入或更新的表,返回值包括数字 受插入或更新操作影响的行数和数字 受触发器或触发器影响的行数。 适用于所有其他类型的 语句,返回值为-1 。如果发生回滚,则返回 值也是-1。
答案 1 :(得分:1)
我不知道你看起来喜欢什么。但是,如果它是插入(正确),它应该返回1.否则,它将返回-1;
以下是我测试此代码的代码:
SQL PROC和TABLE
CREATE TABLE test(id INT, name VARCHAR(50), InsertDate DATETIME)
CREATE proc cmtUpdateOrganization (@id int, @FullName varchar(50))
AS
BEGIN
IF NOT EXISTS(Select id from Test where Id = @id)
BEGIN
INSERT test(id,Name, InsertDate)values(@id, @FullName, GETDATE());
END
END
GO
这是我的代码。第一次,你应该得到1.第二次相同的数据,-1。
<强> CODE 强>
try {
string sql = "exec cmtUpdateOrganization @Id, @FullName";
using (var db = new DB()) {
db.EnableAutoSelect = false;
var result = db.Execute(sql, new { Id = 1, FullName = "Name" });
Console.WriteLine(string.Format("Your result is {0}", result));
}
} catch ( Exception ex) {
Console.WriteLine(ex.Message.ToString());
}