0

我正在尝试类似的东西:

            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 本身上使用相同的参数进行了验证。

输出参数工作正常,但这不是我喜欢做的,因为它涉及更改大量存储过程。

4

2 回答 2

3

PetaPoco 中的 Execute 方法只是从 SqlCommand 对象中调用 ExecuteNonQuery() 方法。

这就是您返回 -1 的原因,它直接来自MSDN

引用自 MSDN

您可以使用 ExecuteNonQuery 来执行目录操作(例如,查询数据库的结构或创建数据库对象,如表),或者通过执行 UPDATE、INSERT 或 DELETE 语句来更改数据库中的数据而不使用 DataSet。

尽管 ExecuteNonQuery 不返回任何行,但任何输出参数或映射到参数的返回值都会填充数据。

对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,则返回值也是 -1。

于 2012-01-20T21:41:51.160 回答
1

我不知道你的proc是什么样的。但是,如果它进行了插入(正确),它应该返回 1。否则,它将返回 -1;

这是我测试这个的代码:

SQL PROC 和表

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。

代码

    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());
    }
于 2012-02-21T21:02:12.963 回答