Обсуждение: DateStyle не могу понять проблему.

Поиск
Список
Период
Сортировка

DateStyle не могу понять проблему.

От
Dmitry Kruglov
Дата:
Добрый вечер уважаемые программисты.

Есть две винды XP SP3 (дистрибутивы совершенно одинаковые).

На каждой винде стоят одинаковые драйверы для работы с сервером.
Вот эти дрова ставлю:
ftp://ftp.midisa.net/man2/psqlodbc.msi

Сервер установлен на Linux Ubuntu. На сервере в базе данных прописано
*DateStyle **SQL,MDY.*
В программе формирую строку 'm/d/y' (показываю схематично), делаю запрос.

Подключение идет через: PostgreSQL Unicode версия драйвера 8.04.02.00

В одной винде работает без ошибок, в другой ругается на формат даты.

Если с сервака удаляю DateStyle то в той в которой было отлично,
появляется ошибка формата даты, а в другой в которой не работала
начинает работать.

Подскажите пожалуйста, в чем может быть проблема?

Может где то еще в винде какие то настройки дополнительные есть?

Или может нужно программу как то хитро инициализировать?

Инициализирую программу как обычно:
    _tsetlocale(LC_TIME, _T(""));
    _tsetlocale(LC_CTYPE, _T(""));

Пишу на MFC.
Программа одна и та же.

Буду очень признателен за Вашу помощь.
Спасибо.


Re: DateStyle не могу понять проблему.

От
Dmitry Kruglov
Дата:
Добрый день Вячеслав.

Вношу корректировку к последнему письму.
В одной винде работает нормально с DateStyle, в другой не работает
вообще никак. С DateStyle и без него не работает.

Открыл программу под отладчиком, посмотрел что там формируется.
вот такая строка:
insert into "sprPartiy" ("IDUSER","DATAOFORMLEN","TYPESKLADA") values
(1,'1/23/2012',1)

Пытаюсь выполнить запрос, говорит (не на русском языке), что '1/23/2012'
выходит за пределы диапазона. Не могу выполнить. Хотя на сервере четко
сказано SQL,MDY.

Эта же программа на другой машине отлично выполняется.

Поставил последние драйверы ODBC все равно та же история.

Не могу понять где нужно посмотреть....

Вы имеете ввиду нужно написать запрос так?

insert into "sprPartiy" ("IDUSER","DATAOFORMLEN","TYPESKLADA") values
(1,to_date('2012-01-23', 'yyyy-mm-dd'),1)

Если даже так сработает .... то сильно много мест в программе нужно
будет менять т.к. программу пишу 8 лет. В ней десятки тысяч строк
программного кода ....

Может будут другие предложения?


23.01.2012 22:42, Viacheslav N Tararin пишет:
> Добрый день.
> Со всех ОС которые у нас есть корректно работает строка формата
> 'yyyy-mm-dd'.
> Для верности рекомендую явно приводить с указанием формата
> to_date('2012-12-21', 'yyyy-mm-dd') и ни от чего не зависиш.
>
>
> 23.01.2012 17:00, Dmitry Kruglov пишет:
>> Добрый вечер уважаемые программисты.
>>
>> Есть две винды XP SP3 (дистрибутивы совершенно одинаковые).
>>
>> На каждой винде стоят одинаковые драйверы для работы с сервером.
>> Вот эти дрова ставлю:
>> ftp://ftp.midisa.net/man2/psqlodbc.msi
>>
>> Сервер установлен на Linux Ubuntu. На сервере в базе данных прописано
>> *DateStyle **SQL,MDY.*
>> В программе формирую строку 'm/d/y' (показываю схематично), делаю
>> запрос.
>>
>> Подключение идет через: PostgreSQL Unicode версия драйвера 8.04.02.00
>>
>> В одной винде работает без ошибок, в другой ругается на формат даты.
>>
>> Если с сервака удаляю DateStyle то в той в которой было отлично,
>> появляется ошибка формата даты, а в другой в которой не работала
>> начинает работать.
>>
>> Подскажите пожалуйста, в чем может быть проблема?
>>
>> Может где то еще в винде какие то настройки дополнительные есть?
>>
>> Или может нужно программу как то хитро инициализировать?
>>
>> Инициализирую программу как обычно:
>>      _tsetlocale(LC_TIME, _T(""));
>>      _tsetlocale(LC_CTYPE, _T(""));
>>
>> Пишу на MFC.
>> Программа одна и та же.
>>
>> Буду очень признателен за Вашу помощь.
>> Спасибо.
>>
>>
>
>


Re: DateStyle не могу понять проблему.

От
Dmitry Kruglov
Дата:
Всем спасибо за помощь ... Ошибка пропала так же неожиданно как и
появилась.... Стал вызывать функции Windows API, чтобы посмотреть что
там вообще происходит и увидел что ошибка исчезла.
До этого менял в SQL запросе местами день и месяц,  'dd/mm/yyyy'
работало отлично. Как только делал такой формат 'mm/dd/yyyy' (на сервере
именно так), появлялась ошибка.

Сейчас ошибка исчезла и работает хорошо, но не факт, что она снова не
появится.

Гуляют настройки в винде или в драйвере, как обуздать не понятно.
то так формирует дату: 'dd/mm/yyyy'
то так 'mm/dd/yyyy'

А думаю, что проблема не в винде, а в ODBC драйвере, который не понятно
как инициализировать нужно.

Как я понимаю драйвер должен получить настройки формата даты где? С
сервера или где то на локальной машине?

Ошибка происходит в момент записи  даты в базу. И при отображении
сообщения об ошибке, показывает правильный формат даты, который
определен на сервере.

Из этого следует ... нет согласованности ODBC драйвера и сервера.

Что означает: "биндить" типизированные параметры ?
Как это выглядит?

Заранее спасибо.


24.01.2012 14:51, Viacheslav N Tararin пишет:
> Добрый день.
> Чтобы не зависеть от настроек действительно лучше формировать такую
> строку:
>
> insert into "sprPartiy" ("IDUSER","DATAOFORMLEN","TYPESKLADA") values
> (1,to_date('2012-01-23', 'yyyy-mm-dd'),1)
>
> Гарантировано дожна работать и такая
>
> insert into "sprPartiy" ("IDUSER","DATAOFORMLEN","TYPESKLADA") values
> (1,'2012-01-23'::date,1)
>
> у меня никогда не было проблем и с такой (независимо от настроек)
>
> insert into "sprPartiy" ("IDUSER","DATAOFORMLEN","TYPESKLADA") values
> (1,'2012-01-23',1)
>
>
> Хотя правильней всего не клеить строки, а "биндить" типизированные
> параметры, это тянет больше переработок, но избавляет от кучи проблем.
> .
>
> 23.01.2012 18:30, Dmitry Kruglov пишет:
>> Добрый день Вячеслав.
>>
>> Вношу корректировку к последнему письму.
>> В одной винде работает нормально с DateStyle, в другой не работает
>> вообще никак. С DateStyle и без него не работает.
>>
>> Открыл программу под отладчиком, посмотрел что там формируется.
>> вот такая строка:
>> insert into "sprPartiy" ("IDUSER","DATAOFORMLEN","TYPESKLADA") values
>> (1,'1/23/2012',1)
>>
>> Пытаюсь выполнить запрос, говорит (не на русском языке), что '1/23/2012'
>> выходит за пределы диапазона. Не могу выполнить. Хотя на сервере четко
>> сказано SQL,MDY.
>>
>> Эта же программа на другой машине отлично выполняется.
>>
>> Поставил последние драйверы ODBC все равно та же история.
>>
>> Не могу понять где нужно посмотреть....
>>
>> Вы имеете ввиду нужно написать запрос так?
>>
>> insert into "sprPartiy" ("IDUSER","DATAOFORMLEN","TYPESKLADA") values
>> (1,to_date('2012-01-23', 'yyyy-mm-dd'),1)
>
>>
>> Если даже так сработает .... то сильно много мест в программе нужно
>> будет менять т.к. программу пишу 8 лет. В ней десятки тысяч строк
>> программного кода ....
>>
>> Может будут другие предложения?
>>
>>
>> 23.01.2012 22:42, Viacheslav N Tararin пишет:
>>> Добрый день.
>>> Со всех ОС которые у нас есть корректно работает строка формата
>>> 'yyyy-mm-dd'.
>>> Для верности рекомендую явно приводить с указанием формата
>>> to_date('2012-12-21', 'yyyy-mm-dd') и ни от чего не зависиш.
>>>
>>>
>>> 23.01.2012 17:00, Dmitry Kruglov пишет:
>>>> Добрый вечер уважаемые программисты.
>>>>
>>>> Есть две винды XP SP3 (дистрибутивы совершенно одинаковые).
>>>>
>>>> На каждой винде стоят одинаковые драйверы для работы с сервером.
>>>> Вот эти дрова ставлю:
>>>> ftp://ftp.midisa.net/man2/psqlodbc.msi
>>>>
>>>> Сервер установлен на Linux Ubuntu. На сервере в базе данных прописано
>>>> *DateStyle **SQL,MDY.*
>>>> В программе формирую строку 'm/d/y' (показываю схематично), делаю
>>>> запрос.
>>>>
>>>> Подключение идет через: PostgreSQL Unicode версия драйвера 8.04.02.00
>>>>
>>>> В одной винде работает без ошибок, в другой ругается на формат даты.
>>>>
>>>> Если с сервака удаляю DateStyle то в той в которой было отлично,
>>>> появляется ошибка формата даты, а в другой в которой не работала
>>>> начинает работать.
>>>>
>>>> Подскажите пожалуйста, в чем может быть проблема?
>>>>
>>>> Может где то еще в винде какие то настройки дополнительные есть?
>>>>
>>>> Или может нужно программу как то хитро инициализировать?
>>>>
>>>> Инициализирую программу как обычно:
>>>>       _tsetlocale(LC_TIME, _T(""));
>>>>       _tsetlocale(LC_CTYPE, _T(""));
>>>>
>>>> Пишу на MFC.
>>>> Программа одна и та же.
>>>>
>>>> Буду очень признателен за Вашу помощь.
>>>> Спасибо.
>>>>
>>>>
>>>
>>
>
>