2011-11-14 31 views
8

変更された行の量を返す前にこのメソッドを使用しました。私は挿入メソッドを実行するために、ストアドプロシージャで挿入が正常に実行されますが、ExecuteNonQueryからの戻り値は常に-1を返します。c#:ExecuteNonQuery()は-1を返します

int ret = 0; 

using (SqlConnection conn = new SqlConnection(this.ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand(QueryName, conn)) 
    { 
     conn.Open(); 

     if (Params != null) 
      cmd.Parameters.AddRange(Params); 

     cmd.CommandType = CommandType.StoredProcedure; 

     ret = cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 
} 

return ret; 

はなぜか-1の代わりに、実際の行数変更:ここで

は、私のC#のコードですか?

+0

テーブルの変更は実際には行われますが、-1が得られていますか? – Tudor

+0

おそらく、あなたのsprocが返すものは何でも返します。それ以外の場合は-1となります。 –

+0

実際にプロファイラを使ってSQLコールを捕捉し、手動で実行して実際に変更された行番号を確認しましたか? –

答えて

21

あなたがテーブルにメソッドの戻り値を UPDATE/INSERTを行う店舗の手続きを呼び出すために、このメソッドを使用する場合は-1が格納procudere がON値でのSET NOCOUNTを持っている場合。

- マイクロソフトからsource

5

:UPDATE、INSERTの場合

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

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

あなたはおそらく、あなたのストアドプロシージャから戻ってきているどのような値の直接テーブルの変更

0

をストアドプロシージャを使用しているため-1取得していないですか?ストアドプロシージャのコードを表示できますか?必要な値を返すようにストアドプロシージャを編集する必要があります。または、ストアドプロシージャが-1を返すか、ストアドプロシージャが返す変数に-1を返します。

0

@[email protected]@Rowcountのようなストアドプロシージャからの行カウント出力を取得します。 DALでは、dbManager.AddOutParameter("RowCount", DbType.Int32, rowCount);を使用します。最後の行では、(int)dbManager.GetParameterValue("RowCount")となります。

関連する問題