Конференция "Базы" » ADO+ClientDataSet+TThread [D7, Access]
 
  • Alex_C (17.11.11 15:24) [60]
    Ок! Думал что наоборот лучше меньше.

    Однако на счет UPDATE я рано радовался. Как то "странно" он работает.
    Даю комманду
    UPDATE SpotTable SET Info="111" WHERE (DXCall=:DXCall)


    и все поля Info становятся пустыми, вместо 111.
  • Alex_C (17.11.11 15:26) [61]

    > Строковое представление зависит от текущей локали


    Так это я уже понял - в том то и дело - дату как параметр передаю! Вот в чем непонятка. Причем для всех 3-х полей типа даты - одна и таже проблема.
  • Alex_C (17.11.11 15:28) [62]
    Параметры:

     FSpotCommand := TADOCommand.Create(nil);
     with FSpotCommand do
     begin
       Connection := FSpotConnection;
       Parameters.Clear;
       with Parameters.AddParameter do
       begin
         Name := 'DXCall';
         DataType := ftString;
         Direction := pdInput;
         Size := 50;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'DateSpot';
         DataType := ftDate;
         Direction := pdInput;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'TimeSpot';
         DataType := ftTime;
         Direction := pdInput;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'Freq';
         DataType := ftFloat;
         Direction := pdInput;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'SpoterCall';
         DataType := ftString;
         Direction := pdInput;
         Size := 20;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'Info';
         DataType := ftString;
         Direction := pdInput;
         Size := 100;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'DateTimeOfGet';
         DataType := ftDateTime;
         Direction := pdInput;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'IsNewCountry';
         DataType := ftInteger;
         Direction := pdInput;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'IsNewSpot';
         DataType := ftBoolean;
         Direction := pdInput;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'Country';
         DataType := ftString;
         Direction := pdInput;
         Size := 10;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'BandADIF';
         DataType := ftString;
         Direction := pdInput;
         Size := 20;
       end;
       with Parameters.AddParameter do
       begin
         Name := 'Mode';
         DataType := ftString;
         Direction := pdInput;
         Size := 20;
       end;




            with FSpotCommand.Parameters, FSpotCommand do
            begin
              CommandText := 'UPDATE SpotTable SET Info=:Info WHERE (DXCall=:DXCall) ' +
               'AND (DateSpot=:DateSpot) AND (TimeSpot=:TimeSpot) ' +
               ' AND (Freq=:Freq) AND (SpoterCall=:SpoterCall)';
              ParamByName('DXCall').Value := ClusterData.DXCall;
              ParamByName('DateSpot').Value := Trunc(SpotDate);
              ParamByName('TimeSpot').Value := Frac(SpotDate);
              ParamByName('Freq').Value := ClusterData.Freq;
              ParamByName('Info').Value := ClusterData.Info;
              ParamByName('SpoterCall').Value := ClusterData.SpoterCall;
              Execute(ChangeRecords, '');
            end;

  • Alex_C (17.11.11 15:31) [63]
    Убираем параметры даты/времени - все работает.... относительно работает... поле Info становится пустым.
  • Inovet © (17.11.11 15:45) [64]
    > [62] Alex_C   (17.11.11 15:28)
    > ParamByName('DateSpot').Value := Trunc(SpotDate);
    > ParamByName('TimeSpot').Value := Frac(SpotDate);

    ParamByName('DateSpot').AsDateTime := StartOfTheDay(SpotDate);
    ParamByName('TimeSpot').AsDateTime := Frac(SpotDate);

    И зачем ты оставил всё-таки два поля? Есть реальная необходимость?

    Непонятно что там с Info.
  • Alex_C (17.11.11 16:00) [65]

    > И зачем ты оставил всё-таки два поля? Есть реальная необходимость?


    Есть некоторая, можно и одно сделать - это из прошлой программы осталось. Мне белее не понятно, почему с DateTime проблемы.


    > ParamByName('DateSpot').AsDateTime := StartOfTheDay(SpotDate);


    Это

    function StartOfTheDay(const AValue: TDateTime): TDateTime;
    begin
     Result := Trunc(AValue);
    end;

  • sniknik © (17.11.11 16:23) [66]
    ftDate - ftDateTime
    ftTime - ftDateTime

    не все понимают "огрызки".

    > почему с DateTime проблемы.
    с ним то как раз проблем нет, а у тебя что?
  • Alex_C (17.11.11 16:33) [67]
    Так. Первую проблему нашел -

    ParamByName('TimeSpot').AsDateTime := Frac(SpotDate);


    Так нельзя.

    По ходу

    > не все понимают "огрызки".

    Нельзя давать отдельно дату и отдельно время.
  • Alex_C (17.11.11 16:49) [68]
    Нашел следующую проблему с UPDATE:


    UPDATE SpotTable SET DateTimeSpot=:DateTimeSpot


    В SET не получается использовать тип DateTime.
  • Alex_C (17.11.11 16:56) [69]

    > В SET не получается использовать тип DateTime.

    Сделал сейчас пробную отдельную программу - все работает..
    Почему же у меня не работает


    procedure UpdateSpot(var SpotCommand: TADOCommand;
     DXCall: string; DateTimeSpot: TDateTime;
     Freq: Double; SpoterCall, Info: string; DateTimeOfGet: TDateTime);
    begin
     with SpotCommand.Parameters, SpotCommand do
     begin
       ParamByName('DXCall').Value := DXCall;
       ParamByName('DateTimeSpot').Value := DateTimeSpot;
       ParamByName('Freq').Value := Freq;
       ParamByName('SpoterCall').Value := SpoterCall;
       ParamByName('Info').Value := Info;
       ParamByName('DateTimeOfGet').Value := DateTimeOfGet;
       Execute(ChangeRecords, '');
     end;
    end;



    Вызываю

             UpdateSpot(FUpdateSpotCommand, ClusterData.DXCall, SpotDate,
               ClusterData.Freq, ClusterData.SpoterCall,
               ClusterData.Info, Now{MinSpotDate});



    Уже вместо MinSpotDate просто Now поставил... Все равно несоответствие типов.
    Сама CommandText

       CommandText := 'UPDATE SpotTable SET DateTimeOfGet=:DateTimeOfGet ' +
         'WHERE (DXCall=:DXCall) AND (DateTimeSpot=:DateTimeSpot) ' +
         'AND (Freq=:Freq) AND (SpoterCall=:SpoterCall) AND (Info=:Info)';

  • Inovet © (17.11.11 17:25) [70]
    > [69] Alex_C   (17.11.11 16:56)
    > Почему же у меня не работает

    Определение таблицы покажи. Реальное только.
  • Anatoly Podgoretsky © (17.11.11 17:48) [71]

    > Alex_C   (17.11.11 16:00) [65]

    Не используй свойства AS
  • Anatoly Podgoretsky © (17.11.11 17:48) [72]
    > Alex_C  (17.11.2011 16:33:07)  [67]

    Можно
  • Anatoly Podgoretsky © (17.11.11 17:49) [73]
    > Alex_C  (17.11.2011 16:49:08)  [68]

    Чей тип DateTime?
  • Anatoly Podgoretsky © (17.11.11 17:50) [74]
    > Alex_C  (17.11.2011 16:56:09)  [69]

    Да брось ты эти базы, пойди пивка выпей
  • Anatoly Podgoretsky © (17.11.11 17:52) [75]

    > :DateTimeSpot

    Разве Акцесс такие имена понимает
  • Alex_C (17.11.11 22:30) [76]

    > Можно


    Я чего то окончательно запутался. Честно говоря не думал, что организовать работу более 100 радиостанций с разным интерфейсом через ком-порт без практически документации будет проще, чем со связкой SQL+ADO разобраться. ))) Причем на сколько я понимаю, проблема не в SQL, а именно в ADO.


    > Не используй свойства AS


    Так я его и не использую.


    > Разве Акцесс такие имена понимает


    Понимает.


    > Определение таблицы покажи. Реальное только.


    Саму таблицу я создал в эксесе - конструкторе таблиц. Смысла программно ее создавать пока не было, пока окончательно все проблемы не решу.

    Большое спасибо за столь активную мне помощь - очень со многими весьма мало документированными вещами разобрался.
    Однако проблема по ходу не в неправильности SQL запросов как таковых, а в связке с ADO.
    Типичный пример - у меня было поле Band - так эксес его воспринемать не хочет, ругается. Хотя это не зарезервированное поле SQL.
    В общем пока пробую и так, и так - пытаюсь понять суть проблемы.
  • Inovet © (17.11.11 23:34) [77]
    > [76] Alex_C   (17.11.11 22:30)
    > Однако проблема по ходу не в неправильности SQL запросов
    > как таковых, а в связке с ADO.

    Ты через ADO можешь ведь не только к Аксес, который не Аксес а Jet, обращаться, но и к другим серверам, Jet не сервер.
  • Inovet © (17.11.11 23:35) [78]
    > [77] Inovet ©   (17.11.11 23:34)
    > но и к другим серверам

    У них и SQL отличается, и может сильно отличаться.
  • Alex_C (18.11.11 00:10) [79]
    А причину то я нашел - Execute(ChangeRecords, ''); - вот она!
    Нельзя Paramerts в "" устанавливать!
    Вообще вот по этому нет документации!
 
Конференция "Базы" » ADO+ClientDataSet+TThread [D7, Access]
Есть новые Нет новых   [134431   +10][b:0][p:0.004]