2012-01-20 14 views
0

私のような何かをしようとしている:ストアドプロシージャの戻り値は常に-1を返します(出力しないパラメータ)

  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

私は、あなたの質問に "petapoco" の部分を逃しました。だから私は誰も間違った考えを得ないように私の答えを削除しました。誰かがあなたの質問を見ることを願っています。 –

答えて

3

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

-1を返す理由は、MSDNから直接得られます。あなたは( 例えば、データベースの構造を照会またはテーブルなどのデータベース オブジェクトを作成)カタログ操作を実行するためには、ExecuteNonQueryを使用することができ、またはデータを変更するMSDN

から引用

のないデータベースでは、UPDATE、INSERT、またはDELETEステートメントを実行してDataSetを使用します。

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

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

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回目は-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()); 
    } 
関連する問題