该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
VS 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 [Sally] UNION ALL SELECT 5;
受影响的列: 1
查询批次:
SELECT 123 AS [Bob];
WAITFOR DELAY '00:00:05.000'; -5秒暂停
SELECT 2 AS [Sally] UNION ALL SELECT 5;
受影响的列: 2
123
查询批次: #TestProc
受影响的列: 453
查询批次: #TestProc
受影响的行: 17