SqlCommand.StatementCompleted
イベントは、バッチ内の各ステートメントの後に起動します、そしてイベントの特性の一つは(まあ、ほとんど唯一のプロパティ)は、イベントを発射した文によって影響を受ける行の数です。
いくつかのメモ:
- この情報を得るための要件は、あなたがなかったことではない指定
SET NOCOUNT ON;
、または逆に、あなたがやった指定しますSET NOCOUNT OFF;
。
- すべてのイベント
Execute___()
は、実行中ではなく、各の完了時に発生します。
StatementCompletedEventArgs.RecordCount
行カウント含むSELECT
一方、文をSqlDataReader.RecordsAffectedプロパティのみDMLステートメント(から行数を報告しINSERT
、UPDATE
、DELETE
、など)。
StatementCompleted
イベントには、イベントを発生させたバッチからの個々のSQLステートメントは含まれません。ただし、イベントハンドラーにはsender
入力パラメーターとしてが送信されます。これはSqlCommand
クエリバッチのであり、プロパティにキャストsender
しSqlCommand
てから調べると、そのバッチを確認できCommandText
ます(これは以下の例に示されています)。
ドキュメントは、非常に私はショーは、このイベントの両方のために発射する例まで働いているように、この上スパースExecuteNonQuery
とExecuteScalar
の両方のアドホッククエリやストアドプロシージャ(すなわちのためだけでなく、SqlCommand.CommandType
のText
対をStoredProcedure
:)
using System;
using System.Data;
using System.Data.SqlClient;
namespace StatementCompletedFiring
{
class Program
{
static void Main(string[] args)
{
using (SqlConnection _Connection =
new SqlConnection("Integrated Security = True;"))
{
using (SqlCommand _Command = new SqlCommand(@"
SET NOCOUNT OFF; -- ensures that the 'StatementCompleted' event fires
EXEC('
CREATE PROCEDURE #TestProc
AS
SELECT * FROM sys.objects;
SELECT * FROM sys.tables;
');
SELECT * FROM sys.objects;
", _Connection))
{
_Command.StatementCompleted += _Command_StatementCompleted;
try
{
_Connection.Open();
_Command.ExecuteNonQuery();
_Command.CommandText = @"
SELECT 123 AS [Bob];
WAITFOR DELAY '00:00:05.000'; --5 second pause to shows when the events fire
SELECT 2 AS [Sally]
UNION ALL
SELECT 5;
";
Console.WriteLine("\n\t");
Console.WriteLine(_Command.ExecuteScalar().ToString());
Console.WriteLine("\n");
_Command.CommandType = CommandType.StoredProcedure;
_Command.CommandText = "#TestProc";
_Command.ExecuteNonQuery();
}
catch (Exception _Exception)
{
throw new Exception(_Exception.Message);
}
}
}
}
static void _Command_StatementCompleted(object sender,
StatementCompletedEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("\nQuery Batch: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(((SqlCommand)sender).CommandText);
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("Row(s) affected: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(e.RecordCount.ToString() + "\n");
Console.ResetColor();
}
}
}
出力:
クエリバッチ:
SET NOCOUNT OFF; -'StatementCompleted'イベントが発生することを確認します
EXEC( 'CREATE PROCEDURE #TestProc AS SELECT * FROM sys.objects;
SELECT * FROM sys.tables; ');
SELECT * FROM sys.objects;
影響を受ける行: 453
クエリバッチ:
SELECT 123 AS [Bob];
WAITFOR DELAY '00:00:05.000 '; --5秒の一時停止
SELECT 2 AS [サリー] UNION ALL SELECT 5;
影響を受ける行: 1
クエリバッチ:
SELECT 123 AS [Bob];
WAITFOR DELAY '00:00:05.000 '; --5秒の一時停止
SELECT 2 AS [サリー] UNION ALL SELECT 5;
影響を受ける行: 2
123
クエリバッチ: #TestProc
影響を受ける行: 453
クエリバッチ: #TestProc
影響を受ける行: 17