Поиск:

Ответ в темуСоздание новой темы Создание опроса
> update поля с датой типа TDateTime в Access, не верно обновляет дату через Parameter 
V
    Опции темы
vinvin
Дата 29.9.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я хочу обновить поле в базе Access типа Datetime. Вместо обновления записывается пустая дата. Если просто в коде прописать функцию  как в закоментированном месте, то все нормально - пишет текущую дату. Как быть, ведь мне нужно писать в поле не текущую дату, а вычисленную.

Код

  adq:TADOQuery;
  Par:TParameter;
begin
    adq := TADOQuery.Create(nil);
    try
      with adq do begin
        // коннект д.б открыт об этом не беспокоимся
        Connection:=DataUnit.DataModule1.ADOConnection1;
        Close;
        SQL.Clear;
        SQL.Add(Format(

        'update modem set NextTimeArc=:D1 where id=%d',[Modem.id]));

//        SQL.Add(Format(
//        'update modem set NextTimeArc=Now() where id=%d',[id]));

        Par :=Parameters.AddParameter;
        Par.Name := 'D1';
        Par.DataType := ftDateTime;
        Par.Direction := pdInput;
        Par.Value := Now; //NextTimeArc;
        ExecSQL;
      end;
    finally
      adq.Free;
    end;


Кстати,  я читал ответ Vita, когда он отвечал про SQL сервер. Там параметр тоже не хотел парситься. Но здесь-то я ничего не парсю, т.е. никаких преобразований из текста - гольная дата и на тебе. Может это ошибка ADO?

Это сообщение отредактировал(а) vinvin - 29.9.2007, 22:44
PM MAIL   Вверх
ALeXandrK
Дата 29.9.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

  adc:TADOCommand;
begin
    adc := TADOCommand.Create(nil);
    try
      with adc do 
      begin
        // коннект д.б открыт об этом не беспокоимся
        Connection:=DataUnit.DataModule1.ADOConnection1;
        CommandType := cmdText;
        CommandText  :=  'update modem set NextTimeArc=:d1 where id=:d2;';
        Parameters.ParseSQL(SQL, true);
        Parameters.ParamValues['d1; d2'] := VarArrayOf([Now,Modem.id]);
        ExecSQL;
      end;
    finally
      adc.Free;
    end;


Старайся не пользоваться компонентом TADOQuery. Он был придуман только, чтобы
легко могли перейти с TQuery... Все действия лучше делать с помощью TADOCommand,
TADOStoredProc, TADODataSet. Познакомься с ними поближе и поймешь, что
многие действия сильно упростяться smile 

Это сообщение отредактировал(а) ALeXandrK - 29.9.2007, 22:56


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
vinvin
Дата 29.9.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, попробую.

Попробовал-пошло.  Только там ParseSQL(SQL.Text).
 

Но почему не работал мой код? То есть на поверку есть два кода:

Код

        SQL.Text :=
          'update modem set NextTimeArc=:d1 where id='+IntToStr(Modem.id);
        with Parameters.AddParameter do begin
          Name := 'd1';
          DataType := ftDateTime;
          Direction := pdInput;
          Value := Now;
        end;
        ExecSQL;


и другой
Код

        Parameters.ParseSQL(SQL.Text,True);
        Parameters.ParamByName('d1').Value:=Now;


Первый вариант должен быть более надежным. Там все явно передается. 
Второй вариант зависит от надежности кода распознавания. И по сути  делает то же самое, что и первый код. 
Но он почему-то не работает первый вариант? 
Я посмотрел текст ParseSQL. Там просто добавляется параметер методом AddParameter и присваивается ему имя. Не задается ни тип, ни направление. По умолчанию направление получает tdInput а тип ftUnknown. 
Я попробывал поступить так же, т.е. не задавать тип, а направление задать в tdInput. результат тот же.

ВНИМАНИЕ!!! Выяснил. Оказывается не работает строка  Value := Now; 
То есть явный косяк класса TParameter. Работает только  Parameters.ParamByName('d1').Value:=Now;


Это сообщение отредактировал(а) vinvin - 30.9.2007, 00:41
PM MAIL   Вверх
ALeXandrK
Дата 29.9.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Посмотри еще раз на код, я его изменил.


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
vinvin
Дата 30.9.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо еще раз. 
Заменил Query на  Command. 
Постараюсь вообще избавиться от Query. Ведь для ADO действительно "родными" классами как раз являются DataSet, Command и StoredProc.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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