5

10個の異なるINSERTのようなストアドプロシージャがありますが、各INSERT to ASP.NET c#ページに影響を受ける行のCOUNTを返すことで、そのASP.NETページを表示しているクライアントのストアドプロシージャプロセスを表示できますか?

4

3 に答える 3

3

ストアドプロシージャの開始時に次のコマンドを使用する必要があります。

カウントオフを設定

この場合、SQLサーバーは各INSERT / UPDATEの後にリアルタイムでテキストメッセージ(「影響を受けるX行」)をクライアントに送信します。したがって、必要なのは、ソフトウェアでこれらのメッセージを読むことだけです。

これが、Delphi for BACKUPMSSQLコマンドでそれを行う方法の私の答えです。申し訳ありませんが、C#の知識が十分ではありませんが、SqlCommandクラスを使用してC#でそれを行うことができると思います。

于 2012-12-05T10:47:41.813 に答える
2

挿入するたびに、@@ 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'
于 2012-12-05T10:22:32.560 に答える
2

サーバー側では、重大度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
}
于 2012-12-05T10:32:41.860 に答える