|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.04.2009, 02:10 | #1 |
Регистрация: 15.04.2009
Сообщений: 7
|
Обновление набора данных после добавления в таблицу записей "внешней" программой
Здравствуйте.
Имеется локальная база данных Access. В ней две таблицы. Есть внешняя программа (не моя), которая добавляет через ODBC новые записи в первую таблицу со скоростью несколько записей в секунду. Моя программа должна максимально быстро (задержка в 1 секунду - это уже много) копировать вновь поступившие данные из первой таблицы во вторую плюс выполнить с ними некоторые действия. Есть несколько условий, накладываемых внешней программой: 1.моя программа не должна редактировать первую таблицу 2.желательно, чтобы первая таблица не была проиндексирована ( в крайнем случае индекс с возможностью совпадения значений, но не ключевое поле) Для связи с таблицами базы данных использую BDE + ODBC, компонент TTable. В программе использую бесконечный цикл, в каждой итерации которого считывается последняя запись из Таблицы2 и просматривается последовательно каждая запись из Таблицы1 начиная с конца на предмет нахождения последней записи Таблицы2, и соответственно записи, которые расположены ближе к концу считаются новыми и копируются. Число записей в Таблице1 внешняя программа увеличивается в течение дня от 0 до примерно 200000. Столкнулся со следующей проблемой: после того как внешняя программа добавила новые записи в Таблицу1, моя прогамма их не видит, пока они не добавлены в набор данных. Добавить их в набор данных можно переоткрытием (методами Close, Open), но этот вариант мне не подходит, т.к. после переоткрытия указатель оказывается на первой записи и для того, чтобы вернуть его в конец (где и происходит анализ на появление новых записей) методом Last нужно больше секунды если записей уже много (для 150000 записей - секунды полторы) - это слишком долго. Отсюда вопрос, вынесенный в топик: можно ли как-то подтянуть эти вновь добавленные внешней программой записи в набор данных без применения Close Open? И ещё один вопрос, связанный с основным. Каким-то непонятным мне образом добавленные внешней программой в Таблицу1 новые записи всё-таки подтягиваются в набор данных без применения Close и Open, но происходит это примерно раз в минуту, что меня не устраивает. Что инициирует такое "самопроизвольное" добавление записей в набор данных? PS Заранее извиняюсь, если спрашиваю очевидные вещи, в Delphi и базах данных - новичок. |
17.04.2009, 08:47 | #2 | |
Форумчанин
Регистрация: 29.01.2009
Сообщений: 411
|
Попробуйте использовать ADO комоненты, (ADOConnection,ADOSource,ADOQuery), с помощью SQL запросов можно оптемизировать работу программы.
Вот что пишут про тихнологию ADO Цитата:
|
|
17.04.2009, 08:56 | #3 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Я в свое время от него отказался в пользу обычного грида, и подгружал данные "вручную". Мороки не так уж и много.
I'm learning to live...
|
|
18.04.2009, 02:22 | #4 |
Регистрация: 15.04.2009
Сообщений: 7
|
Stilet,
Визуализация в программе не нужна, поэтому DBGrid не использую. S@fer, ADOTable через OLE DB пробовал - побыстрее получается (с точки зрения перемещения указателя из начала в конец набора данных после Close - Open), но всё равно скорость меня не устраивает: указатель после переоткрытия ставится на последнюю запись 0,53 секунды (если записей около 200000) - хотелось бы побыстрее. Т.е. если набор данных Таблицы1содержит последние добавленные внешней программой записи и указатель находится в конце, то всё остальное происходит мгновенно. А вот на то, чтобы обеспечить эти два условия (актуальность набора данных и указатель в конце) получается что уходит 0,53 секунды. До TQuery и TADOQuery ещё не добрался. Попробую. |
18.04.2009, 08:00 | #5 |
Форумчанин
Регистрация: 29.01.2009
Сообщений: 411
|
В таблице есть какокое-нибудь поле-счетчик?
Если есть, то с помощью AdoQuery запоминай номер последней записи, а за тем с помощью того же Query выводи все записи больше этого номера. Тогда скорость обработки должна увеличиться, и не нужно будет сравнивать данные со второй таблицей. а сразу записывать их. |
21.04.2009, 00:56 | #6 |
Регистрация: 15.04.2009
Сообщений: 7
|
Поля-счётчика как такового нет, но есть поле типа Double, значение которого в каждой новой добавленной записи больше, чем в предыдущих записях. Индексировать по нему, как я уже писал, нежелательно. Но! Оказалось, что предложенный вами вариант подходит по скорости, т.к. даже без индексирования запрос на выборку нескольких записей (со значением этого поля большим чем в предыдущей итерации) из 200000 происходит за 0,1 сек., что меня устраивает. Спасибо.
PS Сравнил скорость TQuery и ADOQuery в выполнении моего запроса - оказалась абсолютно одинаковой. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Трехзвенная архитектура "клиент-сервер": обновление данных | Lisi4ka | Помощь студентам | 1 | 07.04.2009 11:14 |
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body | tabikA | HTML и CSS | 5 | 24.02.2009 21:50 |
как "ловить мышку" после ответа HTCAPTION на WM_NCHITTEST | Ruzzz | Win Api | 5 | 15.10.2008 20:31 |
Помогите с программой на С++ "текстовый редактор с поддержкой нескольких кодировок" | alwa | Помощь студентам | 1 | 05.06.2008 19:48 |