Я написал свой собственный 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 строк пострадавших)» каждый Х количество секунд, или ж/д. Нет записей, поступающих от читателя, так как это оператор только для UPDATE, поэтому для подсчета строк использовать .
Возможно ли, используя библиотеку 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
}));
}
}
}
}
}
}
Аналогичный вопрос найден here, хотя описание менее ясно.
Какой код вы используете для выполнения инструкции SQL? – theMayer
@ theMayer bread & butter SqlClient: SqlConnection, SqlCommand, ExecuteReader. –
Это умело, но я хотел бы увидеть полную реализацию того, что вы делаете. – theMayer