以前にこのメソッドを使用して、変更された行の量を返しました。私は挿入メソッドを実行するためのものであり、挿入はストアドプロシージャで正常に実行されますが、ExecuteNonQueryからの戻り値は常に-1を返します。
これが私のC#コードです:
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を取得するのはなぜですか?
このメソッドを使用して、テーブルでUPDATE/INSERTを実行するストアード・プロシージャーを呼び出す場合、ストアード・プロシージャーの値がSET NOCOUNTの場合、メソッドは-1を返します。
-- ソース
Microsoftから:
UPDATE、INSERT、およびDELETEステートメントの場合、戻り値はコマンドの影響を受ける行数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入または更新操作の両方の影響を受ける行数と、1つまたは複数のトリガーの影響を受ける行数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は-1です。ロールバックが発生した場合、戻り値も-1になります。
http://msdn.Microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx
テーブルを直接変更するのではなく、ストアドプロシージャを使用しているため、おそらく-1になります。
_@rowCount=@@Rowcount
_を使用するなど、ストアドプロシージャから出力された行数を取得します。 DALでdbManager.AddOutParameter("RowCount", DbType.Int32, rowCount);
を使用すると、最後の行で_(int)dbManager.GetParameterValue("RowCount")
_として取得されます。
ストアドプロシージャからどのような値を返していますか?ストアドプロシージャのコードを表示できますか。おそらく、ストアドプロシージャを編集して必要な値を返す必要があります。または、ストアドプロシージャが具体的に-1を返すか、ストアドプロシージャが返す変数の値が-1です。