Oracle не хочет использовать NLS_LANG

Суть проблемы: Есть сервер Windows Server 2016 и 2019. На обоих установлен SQLServerReportingServices. Для организации отчетов из базы Oracle устанавливаю ODAC121024_x64. В запросах формат даты (выбор периода отчета) 2019.11 (через точку). Все работает отлично, отчеты выгружаются. Ровно до первой перезагрузки сервера. После перезагрузки ошибка:

Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Не удалось выполнить запрос для набора данных "MainDataSet". ---> Oracle.ManagedDataAccess.Client.OracleException: ORA-01722: invalid number

Устанавливал локаль на америку, сервер английского языка, формат английский, NLS_LANG прописан в AMERICAN_AMERICA.CL8MSWIN1251. Но ничего не помогает. Удаляешь клиента, устанавливаешь заново - все работает. После ребута - опять ошибка. Есть одно решение - использовать формат даты в запросах с запятой т.е. 2019,11 но тогда придется переписывать все отчеты, да к тому же при NLS_LANG америки, и так должно ведь использоваться точка для разделения десятичной части. А используется запятая, и ни в какую не хочет применяться точка. P.S. на сервере Oracle11g. Я использую 12-ю версию ODAC, т.к. при установке 11-й версии, ругается что сервер отчетов не совместим с данной версией.

Пример запроса: select sum from sr_opl o where o.ym=:ym где :ym - это char в формате 2019.01. В наборе данных "MainDataSet" как раз и есть вышеуказанный запрос.

o.ym идет из другого датасета(выборка дат), где идет выборка данных, она явно конвертируемая: SELECT to_char(ym_add(MAX (ym), 1),'9999.99') ym FROM calc WHERE ym >= 2006.10 - и этот запрос идет нормально. а вот когда эта выборка дат вставляется уже в запрос чуть выше - то проблема. Если править "MainDataSet" - то это более 700 отчетов, а запрос бывает по 300 строк. Другой вопрос, почему после установки ODAC поверх существующего, той же версии, в ту же директорию, ничего не меняя, начинает все работать. Но ровно до перезагрузки сервера.

Нашел версию, на которую сервер не ругается (ODAC112040Xcopy_64bit). Результат абсолютно одинаковый. NLS_LANG в системных переменных прописан: В системные переменные все прописано


Ответы (1 шт):

Автор решения: Jekson353

Исходящие данные формировались как положено, это факт. Проблема была с входящими данными. Как оказалось, клиенту ODAC (или самому серверу SSRS?), абсолютно плевать параметры, прописанные в реестр и системные переменные. Исходя из того, что при установке ОС был выбран регион Россия, хоть все языковое пространство и было на Английском - клиент оракла брал данные именно из системных переменных профиля пользователя. Для этого, необходимо зайти на сервер под учетными данными, которые запускают SSRS, и прописать формат даты и локацию на United States. После перезагрузки все заработало как надо. Региональные настройки

Update: Все-таки проблема не решилась.. Серверу по-прежнему плевать на все настройки... После перезагрузки, при просмотре параметров сессии: NLS_LANGUAGE, NLS_TERRITORY и т.д. опять всатает в формат RUSSIA :(

→ Ссылка