Нечетное поведение Oracle + .net при сравнении типов - PullRequest
0 голосов
/ 28 марта 2011

На моем рабочем месте есть приложение .net, поставляемое нам почтовой службой, оно подключается к базе данных oracle, работающей на том же компьютере, и отвечает за регистрацию, хранение и печать отгрузочных этикеток.

Так как хост базы данных и т. Д. Настраивается, мы спросили компанию, можно ли использовать приложение по сети (простое копирование на другой компьютер привело к ошибкам «литерал не соответствует строке формата»), все, что нам сказали это «это невозможно». Не желая принимать ответ «нет», я осмотрел exe с отражателем.

Вместе с представлением Oracle v $ sqlarea я определил ошибки в нескольких функциях сравнения дат, но я понятия не имею, почему приложение работало в первую очередь на исходной машине.

Исходное приложение использует запросы, аналогичные

SELECT * FROM shipping WHERE date = '2011/03/28' --error

легко исправляется чем-то вроде

SELECT * FROM shipping WHERE to_char(date, 'yyyy/mm/dd') = '2011/03/28'

Почему оригинальное приложение работает без каких-либо ошибок? Неверный запрос появляется в представлении v $ sqlarea, когда приложение используется на исходном хосте, если я копирую запрос и запускаю его вручную, используя все остальное, он выдает ошибку, если я запускаю приложение на любом другом компьютере, который выдает ошибка тоже, есть ли в Oracle какой-то параметр, который изменяет запросы на лету, но только для запросов, исходящих с локального компьютера, при сохранении исходного запроса в v $ sqlarea?

Ответы [ 3 ]

1 голос
/ 28 марта 2011

Если вы работаете с датами, вы должны избегать генерации запросов на основе String.Format. Используйте параметризованные селекторы и параметры для установки этих значений.

    OracleCommand cmd = new OracleCommand("SELECT * FROM shipping WHERE date = :dataParam", connection);
    var param = cmd.Parameters.Add("date", OracleDbType.Date);
    param.Value = DateTime.Now;

Это сработало, потому что формат соответствовал настройкам даты и времени на компьютере разработчика и в целевой базе данных.

Другими словами: проблема связана с неверным форматом даты и времени, который вы пытаетесь предоставить.

1 голос
/ 28 марта 2011

Это звучит как разница региональных настроек между двумя клиентскими компьютерами, поскольку форматирование дат будет зависеть от культуры, используемой для преобразования даты в строку в .NET, и если приложение не задает культуру, оно будет использовать настройки текущего вошедшего в систему пользователя, на котором запущено приложение. Это, очевидно, проблема, если ядро ​​базы данных ожидает их в определенном формате. Эта проблема реже возникает при параметризованных запросах, где параметры даты передаются отдельно от запроса и в виде типа данных даты вместо строки.

0 голосов
/ 28 марта 2011

Это может быть из-за региональных настроек на сервере.Убедитесь, что новый сервер настроен на ту же локаль (EN-GB, EN-US или любую другую, на которой настроен исходный сервер).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...