これは非常に興味深い質問です。私は約 5 年前にそれを試みましたが、成功しませんでした。それで、これは私にとってちょっとした挑戦です :) さて、ここに私があなたのために持っているものがあります。
raiserror
SQL 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 クライアントをロックしないようにすることもできます。