Мне нужно использовать хранимые процедуры для доступа к данным, а также принимать сообщения (например, PRINT 'hello'
), отправленные из механизма БД.
Когда я использую InfoMessage
событие соединения SQL и заполняю данные вDataTable
, все работает отлично.
Однако, когда мне приходится читать данные последовательно и использовать SqlDataReader.ExecuteReaderAsync
, соединение прекращает запуск InfoMessage после первого оператора select в хранимой процедуре:
C # code:
using (SqlConnection con = new SqlConnection("connection-string"))
{
con.Open();
con.InfoMessage += (s, e) => {
Console.WriteLine(e.Message);
};
using (SqlCommand command = new SqlCommand("spTestMessage", con))
{
command.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader reader = await command.ExecuteReaderAsync();
int cntr = 0;
while (reader.Read())
{
Console.WriteLine($"Loaded row {cntr++}");
}
// reader.NextResult(); // this line forces firing rest of InfoMessage events
}
}
Хранимая процедура SQL:
CREATE PROCEDURE [dbo].[spTestMessage]
AS
PRINT 'Before select 1'
select * from MyTable
PRINT 'After select 1'
PRINT 'Before select 2'
select * from MyTable
PRINT 'After select 2'
Вывод программы:
Before select 1
Почему он перестает работать?Я думаю, что с Reader что-то не так, потому что когда я использую command.ExecuteNonQueryAsync();
вместо command.ExecuteReaderAsync();
, он тоже работает.
Я случайно обнаружил, что строка комментария reader.NextResult();
заставляет соединение сбрасывать сообщенияи уволить оставшиеся события.Однако, это очень неудачный обходной путь.
Спасибо за любую помощь!