Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Update поля с датой типа DateTime, редактирование записи 
:(
    Опции темы
lenyska
Дата 18.3.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



У меня БД в SQL Server, а приложение в Delphi. Для доступа пользуюсь компанентами ADO.
При попытке сделать Update поля с датой типа DateTime выдается ошибка: Дополнительная возможность не реализованна.
Код:
ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd=smile where id=5');
ADOQuery8.Parameters [0].Value := Edit1.Text ;
ADOQuery8.ExecSQL;

Помогите, пожалуйста. Подскажите, где я ошибаюсь.
Заранее спасибо!!!
PM MAIL   Вверх
Vit
Дата 18.3.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Код

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd= :MyParam where id=5');
ADOQuery8.Parameters.ParseSQL(ADOQuery8.SQL.text, true);
ADOQuery8.Parameters.ParamByName('MyParam').Value := Edit1.Text ;
ADOQuery8.ExecSQL;


Но лучше дату передавать как дату, это позволит избежать проблем если национальные установки клиента и сервера разные:

Код

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd= :MyParam where id=5');
ADOQuery8.Parameters.ParseSQL(ADOQuery8.SQL.text, true);
ADOQuery8.Parameters.ParamByName('MyParam').Value := StrToDateTime(Edit1.Text);
ADOQuery8.ExecSQL;




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 18.3.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



он все равно пишет ошибку: Project1.exe raised exception class EConverError with message "a ' is not a valid date and time'.Process stopped.
независимо от того как вводишь дату: с помощью точек, слешей или запятых.

HELP ME, PLEASE

PM MAIL   Вверх
Vit
Дата 19.3.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



По видимому в моём коде такую ошибку может генерить только StrToDateTime, каклй у вас формат даты установлен на компьютере? Попробуйте выполнить следующую строку:

Showmessage(datetimetostr(now))

и посмотрите на то в каком формате будет выведена дата, в таком же формате попробуйте ввести её в edit. Кроме того хотелось бы знать в каком именно месте происходит ошибка, видоизмените код:

Код

Var t:TDateTime

try
  t:=StrToDateTime(Edit1.Text);
except
  on e:exception do Showmessage('Error convertion string ->date'+#13#10+e.message);
end;

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd= :MyParam where id=5');
ADOQuery8.Parameters.ParseSQL(ADOQuery8.SQL.text, true);
try
  ADOQuery8.Parameters.ParamByName('MyParam').Value := t;
except
  on e:exception do Showmessage('Error assigning parameter'+#13#10+e.message);
end;

try
  ADOQuery8.ExecSQL;
except
  on e:exception do Showmessage('Error executing query'+#13#10+e.message);
end;
 



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 19.3.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет




У меня формат даты: дд.мм.гггг

Изменила код на предложенный вами, но все равно вылетает та же ошибка: Project1.exe raised exception class EConverError with message "a ' is not a valid date and time'.Process stopped.

Что еще можно попробывать?
PM MAIL   Вверх
Vit
Дата 20.3.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(lenyska @ 19.3.2006, 10:21 Найти цитируемый пост)
Изменила код на предложенный вами, но все равно вылетает та же ошибка: Project1.exe raised exception class EConverError with message "a ' is not a valid date and time'.Process stopped.


Такого не бывает потому что не бывает никогда! Я специально добавил в код несколько try..except с подробным описанием ошибки, чтобы идентифицировать строку которая генерит ошибку, если вы это описание в ввиде сообщения не получили, а получили голое сообщение о системной ошибке, значит:

1. Вы не заменили код
или
2. Ошибку генерит вовсе не приведенный код
или
3. Вы запускаете в режиме отладки с перехватом дебуггером дельфи всех ошибок и вместо того чтобы привести сообщение об ошибке которое генерит код указываете мне сообщение об ошибке которое выдаёт дебуггер (в этом случае при появлении ошибки нажмите Ok, затем F9 в Дельфи, когда программа продолжит работу она выдаст сообщение которое я генерю - вот его-то и надо привести здесь, иначе очень трудно понять чего у вас там происходит)



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 20.3.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



У меня третий вариант.

Выскакивает ошибка:
Error executing query
[Microsoft][ODBC SQL Server Driver] Дополнительная возможность не реализованна

Собственно, это тоже самое, что у меня было вначале.
Это хорошо или плохо? И что с этим вообще делать?

PM MAIL   Вверх
Vit
Дата 20.3.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Хм... очень странно, а вот так работает:

Код

Var t:TDateTime

try
  t:=StrToDateTime(Edit1.Text);
except
  on e:exception do Showmessage('Error convertion string ->date'+#13#10+e.message);
end;

ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.SQL.Add('update znakomue set day_rojd='''+FormatDateTime('yyyy-mm-dd', t)+ ''' where id=5');

try
  ADOQuery8.ExecSQL;
except
  on e:exception do Showmessage('Error executing query'+#13#10+e.message);
end;


Кстати какого типа поле day_rojd в таблице?



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 20.3.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



АААААААА!!!!!!!

СУПЕР
Все работает
Спасибо вам ОГРОМЕННОЕ, вы мне очень помогли
smile smile smile
PM MAIL   Вверх
Vit
Дата 20.3.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 21.3.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



А меня уже ничего не удивляет.
Главное, что работает! И я этому безумно рада
PM MAIL   Вверх
Vit
Дата 21.3.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(lenyska @ 21.3.2006, 02:06 Найти цитируемый пост)
меня уже ничего не удивляет.
Главное, что работает! И я этому безумно рада



Я рад что Вы рады... но обойдя одни грабли случайно стороной не гарантирует шишки следующий раз. Дело Ваше, но желательно разбираться до конца... Это помогает в будущем, по существу вопроса:

Дата в формате yyyy-mm-dd hh:nn:ss является стандартом для MS SQL Server и при ЛЮБОЙ локализации клиента и сервера строка в таком формате конвертируется в дату правильно


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 21.3.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



если это является стандартом, почему же тогда в таблицах SQL Serverа он выводит дату как dd.mm.yyyy? и в приложение он выводит дату в таком же формате
У меня что, нестандартные настройки в SQL Serverе стоят? но как это может быть, если я ничего не меняла?
PM MAIL   Вверх
Vit
Дата 21.3.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Нет, попробую расставить точки над i.

1) MS SQL Server сам по себе хранит дату в ввиде дробного числа, где целая часть это число дней пошедших с 30 декабря 1899 года, а дробная - это части дня. Попробую объяснить при помощи псевдокода:

если у вас есть в поле дата "21 марта 2006 года, 21:10:00" то
- если взять целую часть от даты то будет "21 марта 2006 года"
- если взять дробную часть от даты то будет "30 декабря 1899 года, 21:10:00"
- один час равен 1/24 единицы в том поле
- одна минута равна 1/(24*60)

2) Когда вы вставляете в запрос дату в кавычках, то сервер вначале конвертирует её в своё представление в ввиде дробного числа, а потом оперирует им. НО! Конвертация зависит от используемых национальных установок, вы пишете на дельфи например StrToDateTime('01/02/03') и на вашем компьютере стоят национальные установки российские, то эта функция вернёт дату "01 февраля 2003" года, а если у вас стоят американские установки то эта эе функция вернёт "02 января 2003" года. Обычно при работе с обычным приложением вам на это наплевать, главное что дата всегда конвертируется в пределах вашего приложения одинаково, соответственно вашим национальным установкам. А вот когда начинаем работать с сервером возникают проблемы: у вас может быть русская локаль, а на сервере - американская и строка даты '01/02/03' для сервера и клиента означают РАЗНЫЕ даты! То что я пытался сделать вначале - это послать дату в формате даты, а не строки параметром и предоставить серверу самому интерпретировать её... и был очень удивлён что у Вас это не работает.

3. Когда вы выводите информацию из базы данных, например в грид, то клиентское приложение естественно пытается конвертировать дату из дробного числа в строку, которая была бы понятна для вас, так как вряд ли вы сможете оперировать легко и наглядно с датами записанными как 36263.21312. Даже когда вы просматриваете базу данных используя Query Analyser или MS SQL Server Enterprise Manager - они являются обычными клиентскими программами, такими же как и ваше приложение. Они при показе даты будут и производить конвертацию дробного числа с сервера в строку. Причём существует 4 вида алгоритма конвертации:
- Использовать какой-то стандартный, зашитый формат
- Использовать формат даты/времени установленный на компьютере где стоит сервер
- Использовать формат даты/времени установленный на компьютере где стоит клиент
- Не заморачиваться и показывать как бог на душу пошлёт... как многие программисты и делают, даже в MS. Итого: выводит дату в формате dd.mm.yyyy КЛИЕНТСКОЕ приложение а не сервер, формируя её по видимому с учётом ваших локальных клиентских установок, а вот когда вы формируете запрос в таком формате, то сервер получив такую строку и (по-видимому) имея какие-то другие настройки просто не способен её переварить.

Итого то что показывает грид - к реальности имеет весьма отдалённое отношение.

4. Программисты из MS предвидели проблемы с конвертацией строк с датой в данные типа "дата-время", поэтому выработали стандарт который позволяет при любых национальных раскладках интерпретировать строку формата YYYY-MM-DD HH:NN:SS всегда правильно. Например у меня стоит американская раскладка и запросы

Код

Select * From t where f='2006-01-02'

и
Код

Select * From t where f='01/02/06'


Для моего MS SQL Server абсолютно идентичные, хотя на вашем сервере с русской нацинализацией, только первый мой запрос будет правильным, второй для вас надо будет менять на

Код

Select * From t where f='02/01/06'


Пока вы работаете в пределах одной и той же локалицации вы можете использовать оба запроса, но предпочтителен вариант '2006-01-02' - так как именно он будет гарантировать выполняемость запроса при любых установках сервера


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
lenyska
Дата 24.3.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 18.3.2006

Репутация: нет
Всего: нет



Спасибки!
Объяснения знающего человека всегда воспринимаются легче, чем текст какой-нибудь книги. Да и не в любой книге найдешь нужную информацию.

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0980 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.