4

複数の行 (約 500k) を調べるストアド プロシージャを実行する Winforms アプリケーションがあります。すでに処理された行数をユーザーに通知するには、n 行ごとに値を返すストアド プロシージャが必要です。たとえば、1000 行ごとに処理されます (ほとんどは ですINSERT)。

そうしないと、すべての行が処理されたときに通知することしかできません。これを解決するためのヒントはありますか?

トリガーやスケジュールされたタスクを使用すると便利だと思いましたが、実装方法がわかりません。

4

1 に答える 1

8

これは非常に興味深い質問です。私は約 5 年前にそれを試みましたが、成功しませんでした。それで、これは私にとってちょっとした挑戦です :) さて、ここに私があなたのために持っているものがあります。

raiserrorSQL Server からメッセージを送信するには、オプションを指定してコマンドを使用する必要がありnowaitます。だから私はストアドプロシージャを書いた

create procedure sp_test
as
begin
    declare @i bigint, @m nvarchar(max)

     select @i = 1

     while @i < 10
     begin
         waitfor delay '00:00:01'
         select @m = cast(@i as nvarchar(max))
         raiserror(@m, 0, 0) with nowait
         select @i = @i + 1
     end
end

SSMS で実行しようとすると、手順がまだ機能している間にメッセージ セクションにそのメッセージが表示されます。OK、サーバーからメッセージを受け取りました。次に、クライアントで処理する必要があります。

そのために、私はこのような SQLCommand を作成しました

SqlCommand cmd = new SqlCommand("sp_Test");
cmd.Connection = new SqlConnection("Server=HOME;Database=Test;Trusted_Connection=True;");

InfoMessageここで、SqlConnection オブジェクトを使用してメッセージをキャッチします。

cmd.Connection.InfoMessage += Connection_InfoMessage;

static void Connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    Console.WriteLine(e.Message);
}

そして今、メッセージを表示しようとしています

cmd.Connection.Open();
try
{
    SqlDataReader r = cmd.ExecuteReader();
}
finally
{
    cmd.Connection.Close();
}

成功 :)

ExecuteNonQuery()ところで、実行の最後に連結されたメッセージを返すため、を使用することはできません。また、クエリをバックグラウンド モードで実行して、winform クライアントをロックしないようにすることもできます。

于 2012-10-21T10:33:51.470 に答える