Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Почему лучше не использовать DateToStr


Автор: Medved 4.9.2003, 10:04
Давно хотел написать, да все как-то не удавалось.
Вообщем была такая ситуация, разрабатывал программу, работала она с БД. Для модификации данных использовал SQL запросы, зашитые в самой программе.
ну например (MS SQL):
Код

with Query1 do begin
 Close;
 SQL.Clear;
 SQL.Add('INSERT INTO (Date, Name)');
 SQL.Add('Values (CONVERT(DATETIME, '''+DateToStr(rxDate.Date)+''', 103), '''+edName.Text+''')');
 ExecSQL;
end;


Возьмем для примера текущую дату - '04.09.2003'. В результате выполнения этого запроса данные сохраняются. Но если в системных настройках краткий формат даты стоит как 'dd.mm.yy' то при этом записшется в базу дата в слудующем виде -'04.09.0003'. В результате при отображении этих данных в любом DBGrid-е выскакивает ошибка "Произошла ошибка при выполнении многошаговой операции" и все, програ виснет намертво. Если краткий формат даты стоит как 'dd.mm.yyyy', тогда все нормально, и все работает.

Так вот, чтобы избежать этого, рекомендую использовать не DateToStr (или DateTimeToStr) а функцию FormatDateTime.

В итоге код будет выглядет так:

Код

with Query1 do begin
 Close;
 SQL.Clear;
 SQL.Add('INSERT INTO (Date, Name)');
 SQL.Add('Values (CONVERT(DATETIME, '''+FormatDateTime('dd.mm.yyyy', rxDate.Date)+''', 103), '''+edName.Text+''')');
 ExecSQL;
end;


И это позволит избежать вышепреведенной ошибки, а так же многих других.

Автор: gray_k 4.9.2003, 10:32
можно дедать так:
var: string ShortDateFormat
begin
...
lcShortDateFormat := ShortDateFormat;
ShortDateFormat = 'dd.mm.yyyy';
{здесь проводим операции с НД}
ShortDateFormat := lcShortDateFormat;
...
end;

Автор: Vit 4.9.2003, 15:08
Используй параметры, тогда этой проблемы не возникнет и сервер сам будет интерпретировать дату в нужном ему формате

Автор: Medved 4.9.2003, 16:09
Да Вит, абсолютно с тобой согласен. Но случаи бывают разные.....

Автор: Fantasist 6.9.2003, 21:09
Что за фигня, почему это сервер не понимает формат записи mm.dd.yy? Это же довольно стандарная запись. Во всяком случае в SELECT я использовал такой формат и без всяких CONVERT все работало нормально.

Автор: Medved 8.9.2003, 05:40
Это зависит от настроек сервера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)