Страница 1 из 1

Кэширование соединения при построении отчёта на Oracle

Добавлено: 08 дек 2020, 17:31
t0pdevice
Здравствуйте.
При построении отчёта с использование библиотеки для подключения к Oracle происходит следующая проблема.
1. Пользователь проходит авторизацию, к примеру, как USER1, работает в программе, строит отчёт Stimulsoft, в который передаётся соединение через:

Код: Выделить всё

report.Dictionary.Databases.Clear();
report.Dictionary.Databases.Add(new StiOracleDatabase("connect", connectionString.ConnectionString));
Видит корректные данные.
2. Пользователь через встроенные средства ПО делает смену учетной записи на USER2. Старые соединения с Oracle закрываются, происходит создание новых подключений к базе под новой учетной записью.
Пользователь формирует отчёт и у него некорректные данные, а именно от пользователя USER1.

Что делали:
  • Пробовали разные библиотеки ODP.NET и Devart, результат отрицательный
  • Пробовали разные версии Stimulsoft, результат отрицательный
  • Пробовали разные версии Oracle, результат отрицательный
  • Думали проблемы из-за пулинга, выключали его и также принудительно убивали все сессии на БД, результат отрицательный
По debug видно, что в report передается корректное соединение USER2, но он строит его все равно, как USER1
Если пользователь USER1 работал в программе и не строил отчёт, то сменившись на USER2 отчёт строится корректно.
Также чтобы отчёт строился правильно в случае проблемы помогает открытие его в ПО в режиме редактора и просто закрытие или получение данных по колонкам, то он строится затем правильно.

Складывается ощущение, что используется какой-то кэш где-то. StiOptions.Engine.ReportCache и другие свойства кэширования в отчёте - выключено.
С чем это может быть связано?

Re: Кэширование соединения при построении отчёта на Oracle

Добавлено: 08 дек 2020, 18:09
t0pdevice
Можно также проверить, добавив DataSource с именем role в отчёт, который покажет под каким пользователем он выполняется:

Код: Выделить всё

select user from dual
Затем в событие Report.BeginRender:

Код: Выделить всё

MessageBox.Show(role.USER);
Вот в сообщение показывается старый пользователь USER1 в данном случае, когда сменился на USER2.

Re: Кэширование соединения при построении отчёта на Oracle

Добавлено: 14 дек 2020, 11:25
Aleksey
Здравствуйте,

Сложно что-то сказать без примера.
Попробуем проанализировать из-за чего может так быть, о результатах дадим знать.

Спасибо.

Re: Кэширование соединения при построении отчёта на Oracle

Добавлено: 21 дек 2020, 16:46
t0pdevice
Я в прицнипе описал все в примере, там обычный любой отчёт.

Re: Кэширование соединения при построении отчёта на Oracle

Добавлено: 23 дек 2020, 17:32
Aleksey
Здравствуйте,

Попробуйте также очистить DataStore
report.Dictionary.DataStore.Clear();

Спасибо.