web-dev-qa-db-ja.com

c#:ExecuteNonQuery()は-1を返します

以前にこのメソッドを使用して、変更された行の量を返しました。私は挿入メソッドを実行するためのものであり、挿入はストアドプロシージャで正常に実行されますが、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を取得するのはなぜですか?

12
Funky

このメソッドを使用して、テーブルでUPDATE/INSERTを実行するストアード・プロシージャーを呼び出す場合、ストアード・プロシージャーの値がSET NOCOUNTの場合、メソッドは-1を返します。

-- ソース

24
kol

Microsoftから:

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

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

テーブルを直接変更するのではなく、ストアドプロシージャを使用しているため、おそらく-1になります。

8
Michael Gattuso

_@rowCount=@@Rowcount_を使用するなど、ストアドプロシージャから出力された行数を取得します。 DALでdbManager.AddOutParameter("RowCount", DbType.Int32, rowCount);を使用すると、最後の行で_(int)dbManager.GetParameterValue("RowCount")_として取得されます。

0
Rubysmita

ストアドプロシージャからどのような値を返していますか?ストアドプロシージャのコードを表示できますか。おそらく、ストアドプロシージャを編集して必要な値を返す必要があります。または、ストアドプロシージャが具体的に-1を返すか、ストアドプロシージャが返す変数の値が-1です。

0
PackratDragon