OracleCommand, кажется, конвертирует литеральные даты - PullRequest
1 голос
/ 10 сентября 2010

Я создал небольшой инструмент запросов для Oracle, используя OracleCommand и OracleDataAdapter. Пользователи просто вводят полный запрос (без параметров), выполняют его, и результаты отображаются в виде таблицы данных. Пока все хорошо, хотя я пробовал неверный запрос, например ::100100

SELECT * FROM mytable WHERE dateColumn = '1-JAN-10'

Этот запрос не является допустимым SQL для Oracle. Вы должны использовать функцию to_date () для сравнения с литералами даты. Разработчик SQL также отвергает его, но каким-то образом мой инструмент запросов просто работает. Означает ли это, что мой OracleCommand здесь немного волшебник или я что-то не так делаю? Также есть способ пропустить это поведение, потому что целью инструмента является тестирование запросов, которые должны работать всегда ...

Спасибо

1 Ответ

4 голосов
/ 10 сентября 2010

Запрос может быть действительным для Oracle.Вам не нужно использовать to_date(), если вы даете строку даты в формате даты вашего сеанса, хотя, как правило, лучше делать это в любом случае, чтобы избежать подобных проблем.

Похоже, у вас другая NLS_DATE_FORMAT в среде вашего инструмента по сравнению с SQL Developer, или формат даты сеанса неявно устанавливается OracleCommand.

Вы можете select value from nls_session_parameters where parameter = 'NLS_DATE_FORMAT' посмотреть, что это такое из SQL * Plus и SQL Developer, а также изваш инструмент;и из nls_database_parameters, чтобы увидеть, какая из них переопределяет базу данных по умолчанию.

Похоже, ваш инструмент может иметь DD-MON-RR, и вы ожидаете какой-то другой формат в другом месте, но без проверки этих таблиц трудно сказать, где вывы используете базу данных по умолчанию и где вы переопределяете ее на уровне сеанса.Я предполагаю, что это БД по умолчанию, и у вас есть переопределение в других ваших средах.

В SQL Developer попробуйте alter session set nls_date_format='DD-MON-RR';, а затем повторно запустите ваш недопустимый запрос - там тоже должно работать.

...