petapoco中的存储过程返回值始终返回-1(不是输出参数)

时间:2012-01-20 05:14:28

标签: sql-server-2008 stored-procedures petapoco

我正在尝试这样的事情:

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

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

2 个答案:

答案 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());
    }