10個の異なるINSERTのようなストアドプロシージャがありますが、各INSERT to ASP.NET c#ページに影響を受ける行のCOUNTを返すことで、そのASP.NETページを表示しているクライアントのストアドプロシージャプロセスを表示できますか?
3 に答える
ストアドプロシージャの開始時に次のコマンドを使用する必要があります。
この場合、SQLサーバーは各INSERT / UPDATEの後にリアルタイムでテキストメッセージ(「影響を受けるX行」)をクライアントに送信します。したがって、必要なのは、ソフトウェアでこれらのメッセージを読むことだけです。
これが、Delphi for BACKUPMSSQLコマンドでそれを行う方法の私の答えです。申し訳ありませんが、C#の知識が十分ではありませんが、SqlCommand
クラスを使用してC#でそれを行うことができると思います。
挿入するたびに、@@ ROWCOUNTを使用して、クエリで値を取得します。
最後のステートメントの影響を受けた行数を返します。行数が20億を超える場合は、ROWCOUNT_BIGを使用します。
サンプル:
USE AdventureWorks2012;
GO
UPDATE HumanResources.Employee
SET JobTitle = N'Executive'
WHERE NationalIDNumber = 123456789
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were updated';
GO
@@rowcount
編集:複数のクエリでどのように取得できますか?次に例を示します。
DECLARE @t int
DECLARE @t2 int
SELECT * from table1
SELECT @t=@@ROWCOUNT
SELECT * from table2
SELECT @t2=@@ROWCOUNT
SELECT @t,@t2'
サーバー側では、重大度10の関数を使用してクライアントにメッセージを送信しますRAISERROR
(重大度が10を超えると、プロシージャの実行を中断する例外が発生します。つまり、実行がCATCH
ブロックに転送されます)。次の例では、エラー番号を追加していないため、関数ではデフォルトのエラー番号50000が使用されRAISERROR
ます。次に例を示します。
DECLARE @count INT = 0
DECLARE @infoMessage VARCHAR(1000) = ''
-- INSERT
SET @count = @@ROWCOUNT
SET @infoMessage = 'Number of rows affected ' + CAST(@count AS VARCHAR(10))
RAISERROR(@infoMessage, 10, 0) WITH NOWAIT
-- another INSERT
SET @count = @@ROWCOUNT
SET @infoMessage = 'Number of rows affected ' + CAST(@count AS VARCHAR(10))
RAISERROR(@infoMessage, 10, 0) WITH NOWAIT
クライアント側で、適切なイベントハンドラーを設定します。次に例を示します。
using (SqlConnection conn = new SqlConnection(...))
{
conn.FireInfoMessageEventOnUserErrors = true;
conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage);
using (SqlCommand comm = new SqlCommand("dbo.sp1", conn)
{ CommandType = CommandType.StoredProcedure })
{
conn.Open();
comm.ExecuteNonQuery();
}
}
static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
// Process received message
}