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サーバー自体で同じパラメーターを使用して検証しました。

出力パラメーターは正常に機能しますが、多くのストアド プロシージャを変更する必要があるため、これは私が好む方法ではありません。

4

2 に答える 2

3

PetaPoco の Execute メソッドは、SqlCommand オブジェクトから ExecuteNonQuery() メソッドを呼び出すだけです。

MSDNから直接取得した -1 を返す理由はここにあります。

MSDN から引用

ExecuteNonQuery を使用すると、カタログ操作 (たとえば、データベース構造のクエリやテーブルなどのデータベース オブジェクトの作成) を実行したり、UPDATE、INSERT、または DELETE ステートメントを実行して DataSet を使用せずにデータベース内のデータを変更したりできます。

ExecuteNonQuery は行を返しませんが、出力パラメーターまたはパラメーターにマップされた戻り値にはデータが取り込まれます。

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドによって影響を受けた行の数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1です。ロールバックが発生した場合、戻り値も -1 です。

于 2012-01-20T21:41:51.160 に答える
1

あなたのprocがどのように見えるかわかりません。ただし、(正しく) 挿入を行う場合は 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 を取得する必要があります。2 回目は同じデータに対して -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 に答える