Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > update поля с датой типа TDateTime в Access


Автор: vinvin 29.9.2007, 22:21
Я хочу обновить поле в базе 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?

Автор: ALeXandrK 29.9.2007, 22:47
Код

  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 

Автор: vinvin 29.9.2007, 22:50
Спасибо, попробую.

Попробовал-пошло.  Только там 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;

Автор: ALeXandrK 29.9.2007, 22:56
Посмотри еще раз на код, я его изменил.

Автор: vinvin 30.9.2007, 00:47
Спасибо еще раз. 
Заменил Query на  Command. 
Постараюсь вообще избавиться от Query. Ведь для ADO действительно "родными" классами как раз являются DataSet, Command и StoredProc.

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