Я должен использовать хранимые процедуры для доступа к данным, а также использовать сообщения (например, PRINT 'hello'
), отправленные из механизма БД.
Когда я использую InfoMessage
событие SQL-соединения и заполняю данные в DataTable
, все работает отлично.
Однако, когда мне нужно последовательно читать данные и использовать SqlDataReader.ExecuteReaderAsync
, соединение перестает запускать InfoMessage после первого оператора выбора в хранимой процедуре:
Код С#:
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();
заставляет соединение сбрасывать сообщения и запускать оставшиеся события. Тем не менее, это очень неудачный обходной путь.
Спасибо за любую помощь!
while(await reader.ReadAsync())
вместоwhile (reader.Read())
. - person vikscool   schedule 10.05.2019