Я написал свой собственный SQL-клиент, потому что устал от SSMS. Я хочу зафиксировать затронутые счетчики строк так же, как SSMS, но SqlCommand.StatementCompleted
поднимается несколько раз, когда ExecuteReader
завершается (или вызывается EndExecuteReader
). Несмотря на то, что операторы в пакете выполняются с регулярным интервалом, кажется, что сообщения DONE_IN_PROC ставятся в очередь на клиенте, а затем выгружаются все сразу, вместо того, чтобы непрерывно подниматься. Нет событий InfoMessage
на протяжении всего цикла. исполнение от SqlConnection
тоже.
Обновление выше, выделенное курсивом.
Скажем, у вас есть оператор SQL, который обновляет строки в цикле, или что-то в этом роде:
WHILE 1=1
BEGIN
UPDATE tbl SET .... WHERE Id BETWEEN i AND i+10;
IF @@ROWCOUNT =0 BREAK;
SET i = i + 10;
END
SSMS правильно показывает «(затронуто 10 строк)» каждые X секунд или w/e. От модуля чтения нет записей, так как это только оператор UPDATE, поэтому нельзя использовать SqlDataReader
для подсчета строк.
Возможно ли это, используя библиотеку SqlClient
?
Рассматриваемый упрощенный код выглядит следующим образом:
class ExecuteWorker
{
public void Start(string query)
{
this._query = query;
this._thread.Start(this.Work);
}
void Work()
{
using(var conn = new SqlConnection(this._connStr))
{
conn.Open();
using(var command = conn.CreateCommand())
{
command.CommandText = this._query;
using(var reader = command.ExecuteReader())
{
while(reader.Read())
{
this._control.BeginInvoke(new Action(()=>{
// update UI
}));
}
}
}
}
}
}
Аналогичный вопрос можно найти здесь, хотя описание менее понятное.