Конференция "Базы" » ADO+ClientDataSet+TThread [D7, Access]
 
  • sniknik © (17.11.11 09:58) [40]
    > после вставки 250 записей, мне нужно удалить повторы.
    может лучше не вставлять повторы? + добавить уникальный индекс по полям, чтобы сама база следила.
  • Alex_C (17.11.11 10:10) [41]

    > может лучше не вставлять повторы


    Мне надо "наоборот" - старый "повтор" тот что в базе - стерся, а на его место новый записался, который кроме полей, которые определяют повтор, содержит еще информативные поля, которые нужно обновить.

    Все же пока не получается удалить повторы сразу за вставкой - если вставлять время ожидания после вставки, а потом удалять, то все ок!
  • sniknik © (17.11.11 10:38) [42]
    > Мне надо "наоборот" ...
    т.е. обходной маневр из-за незнания команды update?
    удачи.

    > Все же пока не получается удалить повторы сразу за вставкой
    асинхронность отключи если есть, и используй 1 коннект если 2.
  • Alex_C (17.11.11 11:00) [43]

    > используй 1 коннект если 2.


    Не могу - данные вставляются в отдельном треде - ему нужен отдельный коннект.


    > обходной маневр из-за незнания команды update?


    мне кажется так дольше получится:


       SELECT DXCall, Freq FROM SpotTable WHERE DXCall=:DXCall AND Freq=:Freq
       if RecordCount > 0 then
         UPDATE
       else
         INSERT



    Чем сначала все записи вставлять, а потом скопом удалять повторы.
  • Anatoly Podgoretsky © (17.11.11 11:10) [44]
    > Alex_C  (17.11.2011 09:42:38)  [38]

    > после вставки 250 записей, мне нужно удалить повторы.

    Подход в корне неверный, не надо добавлять повторы
  • Anatoly Podgoretsky © (17.11.11 11:11) [45]
    > Alex_C  (17.11.2011 10:10:41)  [41]

    Это тоже не требует добавления
  • Медвежонок Пятачок © (17.11.11 11:11) [46]
    AdoCommand

    Call Execute to immediately execute the command specified in the CommandText property.

    RecordsAffected indicates the number of records, if the command operates on data, that are affected by the command after execution.
  • Anatoly Podgoretsky © (17.11.11 11:13) [47]
    > Alex_C  (17.11.2011 11:00:43)  [43]

    Если кажется, крестись
    Ничего удалять не надо
    Кстати логика с запросом неверная, лучше удалить и потом вставлять. Можно
    попытаться вставить и если не получится обновлять - всяко быстрее, кроме
    редких сдучаев
  • Inovet © (17.11.11 11:14) [48]
    > [43] Alex_C   (17.11.11 11:00)
    >   SELECT DXCall, Freq FROM SpotTable WHERE DXCall=:DXCall
    > AND Freq=:Freq
    >   if RecordCount > 0 then
    >     UPDATE
    >   else
    >     INSERT

    Эх. А справку прочитать по UPDATE?
    UPDATE SpotTable SET Freq = :Freq WHERE DXCall=:DXCall AND ...
  • sniknik © (17.11.11 11:54) [49]
    > мне кажется так дольше получится:
    250 записей? человек моргнуть не успеет, не то что как то прореагировать... как ни делай.
    и поток не нужен.

    +
    > Заставлять пользователя ждать 10 сек получения и сортировки данных?
    так где таки тормоза, на получении или сортировке(250 записей???)/вставке? ну так и выноси в поток именно получение... а микросекунды не экономь.
  • Anatoly Podgoretsky © (17.11.11 12:19) [50]
    > sniknik  (17.11.2011 11:54:49)  [49]

    Может лучше разобраться почему такие тормоза при 250 записей?
  • Alex_C (17.11.11 12:22) [51]
    В общем после TTable к SQL переходить тяжеловато :)

    Заработало!))))


             ChangeRecords := 0;
             with FSpotCommand.Parameters, FSpotCommand do
             begin
               CommandText := 'UPDATE SpotTable SET Info=:Info WHERE (DXCall=:DXCall) AND (Freq=:Freq)';
               ParamByName('DXCall').Value := ClusterData.DXCall;
               ParamByName('Freq').Value := ClusterData.Freq;
               ParamByName('Info').Value := ClusterData.Info;
               Execute(ChangeRecords, '');
             end;

             if ChangeRecords = 0 then
               InsertSpot(FSpotCommand, ClusterData.DXCall, Trunc(SpotDate), //Тут вставляем если надо!



    Теперь остался момент по взаимодействию разных ADODataSet - как дождаться удаления записей? Просто хочу очистить таблицу и перечитать ее. В одной ф-ции следать

     DELETE *
     Execute;
     SELECT *
     Execute;


    Не получается - после DELETE надо несколько секунд ждать.
  • sniknik © (17.11.11 13:35) [52]
    > Может лучше разобраться почему такие тормоза при 250 записей?
    ну, там выше вроде упомянуто на получение из инета... вполне нормальные "тормоза" если так.
    вот если бы он сказал, что именно от вставки... тут да.

    > Заработало!))))
    и это пишет "борец с тормозами"... ;) код в цикле выполняется?

    > Теперь остался момент по взаимодействию разных ADODataSet - как дождаться удаления записей?
    читай еще раз [42]
  • Alex_C (17.11.11 14:37) [53]

    > и это пишет "борец с тормозами"... ;) код в цикле выполняется?
    >  


    Блин, ну а как его без цикла то пустить? )))

    Кстати почему то во так не работает

    UPDATE SpotTable SET DateTimeOfGet=:DateTimeOfGet ...



    DateTimeOfGet - тип DateTime. Если менять на другое поле типа стринг

    UPDATE SpotTable SET Info=:Info...



    Все работает. Непонятно.
  • sniknik © (17.11.11 14:54) [54]
    > Блин, ну а как его без цикла то пустить? )))
    имелось ввиду не без цикла, а вынести "за" него бессмысленные внутри "тормозящие" операции... типа внесение запроса, парсинг параметров, оставить только внесение значений и ехекют.

    > Кстати почему то во так не работает
    написано в ошибке.
  • Inovet © (17.11.11 15:04) [55]
    > [54] sniknik ©   (17.11.11 14:54)
    > вынести "за" него бессмысленные внутри "тормозящие" операции...
    > типа внесение запроса, парсинг параметров

    Prepared := true
  • Alex_C (17.11.11 15:15) [56]

    > написано в ошибке.

    Не соответствует тип.
    Проверил - такая ошибка выдается для всех полей типа TDateTime.
  • Alex_C (17.11.11 15:17) [57]

    > вынести "за" него бессмысленные внутри "тормозящие" операции.
    > .


    > Prepared := true

    Тогда придется несколько ADOCommand заводить для UPDATE и отдельно для INSERT. Это правильно?
  • Inovet © (17.11.11 15:19) [58]
    > [56] Alex_C   (17.11.11 15:15)
    > Не соответствует тип.
    > Проверил - такая ошибка выдается для всех полей типа TDateTime.

    Строковое представление зависит от текущей локали, поэтому надо пользоваться параметрами или, если уж приспичило зачем-то строкой с дополнительным тормозои на её разбор, то передавать в каноническом формате. Формат есть в хелпе.
  • Inovet © (17.11.11 15:20) [59]
    > [57] Alex_C   (17.11.11 15:17)
    > Тогда придется несколько ADOCommand заводить для UPDATE
    > и отдельно для INSERT. Это правильно?

    Есть много не просят, отчего бы и не завести сколько надо, раз надо.
 
Конференция "Базы" » ADO+ClientDataSet+TThread [D7, Access]
Есть новые Нет новых   [134431   +10][b:0.001][p:0.001]