@fmj

Как прервать выполнение хранимой процедуры при использовании OracleDataReader?

Есть клиент на c#, подключается к субд oracle через ODP.NET Managed. Отмена команд работает, но если выполнение доходит до метода Read класса OracleDataReader, то прервать выполнение становится невозможно. Хранимая процедура выполняется примерно 30-40 секунд(строится отчет), если запрос на отмену произошел до вызова до метода Read класса OracleDataReader, то все нормально отменяется. Принудительное закрытие(вызов метода close) OracleDataReader-а, команды и соединения(oracleconnection) не помогает. Получается, что реальное выполнение запроса начинается только при попытке чтения данных, потому что, если в хранимой процедуре сначала сохранить все данных в nested_table, а потом уже из нее возвращать ref cursor приложению, то все нормально отменяется, но это очень неудобно реализовывать(и наверное не очень эффективно).
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Получается, что реальное выполнение запроса начинается только при попытке чтения данных
просто oracle получает запрос, думает и потом уже начинает выдавать данные.
Вот пока он думает - ридер "висит" в ожидании...

Кстати почему бы не загнать кусок добычи данных в фоновый поток и либо грохать его по отмене, либо просто забывать...?
Ответ написан
lam0x86
@lam0x86
У OracleDataReader-а есть асинхронные варианты методов. Можно вместо Read вызывать ReadAsync и передавать туда свой CancellationToken.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы