この例外が発生しています:
別の未処理の結果セットがアクティブである間に、トリガーが結果セットを返したか、SET NOCOUNT OFF で実行されていました。
例とそれを回避する方法を使用して、その意味を知りたいです(SET NOCOUNT ON
影響を受ける行の数を知る必要があるため)。
ここで私がやっていることの詳細な説明?
SQL Server DB にAccNodesBalという名前のテーブルがあり、そのテーブルに 3 つのトリガーがあるとします。
FOR UPDATE
INSERT
DELETE
データ層として ADO.net を使用しています。ご存じのとおり、FOR UPDATE
、INSERT
、およびDELETE
ステートメントの戻り値は、コマンドの影響を受けた行数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、両方の影響を受ける行の数が含まれます。
- 挿入または更新操作
- およびトリガーまたはトリガーの影響を受ける行の数。
他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。
私のアプリケーション(コード)では、変数でExcecuteNonQuery
影響を受ける行数を使用して取得し、それが2であることを検証して、トリガーが起動され、すべてがログに記録されることを確認します。int
しかし、私はこのエラーが発生しています:
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
while another outstanding result set was active.
SET NOCOUNT ON
検索した結果、トリガーでキーワードを使用する必要があることがわかりました。残念ながら、トリガーは影響を受ける行の値を返さないため、これは私のアプリケーションでは機能しません。を使用せずに更新ステートメントとトリガーから影響を受ける行数を取得する別の方法を知っている人はいますSET NOCOUNT ON
か?
これが私のコードです
int recCount = adpt.cmdMovementUpdate(
amtType == EFG.Acc.AccNodeService.Contracts.Entities.AmountType.Debit ? 0 : Amount,
amtType == EFG.Acc.AccNodeService.Contracts.Entities.AmountType.Debit ? Amount : 0,
NodeID, PeriodID, Convert.ToInt16(CurrCode), Convert.ToByte(BalCurrType));
ここでadpt
、TableAdapterには私の sql Updateコマンド クエリが含まれており、Web サービスによって消費される WCF サービスに実装されており、アプリケーションはこの Web サービスを消費します。
検索後、 の使用が推奨されていることがわかりましたがSET NOCOUNT ON
、 から影響を受ける行の結果に依存する WCF サービスで検証があるため、それは機能しませんExecuteNonQuery
。