Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2009, 02:10   #1
dimmm
 
Регистрация: 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 и базах данных - новичок.
dimmm вне форума Ответить с цитированием
Старый 17.04.2009, 08:47   #2
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Попробуйте использовать ADO комоненты, (ADOConnection,ADOSource,ADOQuery), с помощью SQL запросов можно оптемизировать работу программы.
Вот что пишут про тихнологию ADO
Цитата:
ADO (Active Data Objects) - это высокоуровневый компонент технологии доступа к данным от Microsoft. (т.н. MDAC - Microsoft Data Access Components) Другие компоненты - это старый добрый ODBC и новый низкоуровневый интерфейс OLE DB.

Данными для ADO могут быть как привычные таблицы Access или серверные базы MS SQL или Oracle, так и несколько экзотичные Microsoft Active Directory Service, XML-файлы и т.п.

ADO- более новая технология чем ODBC, работает через интерфейс OLE DB.

Впрочем, можно использовать ADO и через ODBC - хотя стоит ли? OLE DB превосходит ODBC по скорости и, похоже, Microsoft основную ставку делает именно на парочку ADO+OLE DB. Более того, похоже, и Borland делает ставку на ADO, старик BDE готовится к отправке на пенсию, а компоненты для работы с ADO от Borland (ADOExpress) теперь входят в поставку Delphi.
S@fer вне форума Ответить с цитированием
Старый 17.04.2009, 08:56   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
можно ли как-то подтянуть эти вновь добавленные внешней программой записи в набор данных без применения Close Open?
Подозреваю что ты используешь DBGrid.
Я в свое время от него отказался в пользу обычного грида, и подгружал данные "вручную". Мороки не так уж и много.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.04.2009, 02:22   #4
dimmm
 
Регистрация: 15.04.2009
Сообщений: 7
По умолчанию

Stilet,
Визуализация в программе не нужна, поэтому DBGrid не использую.


S@fer,
ADOTable через OLE DB пробовал - побыстрее получается (с точки зрения перемещения указателя из начала в конец набора данных после Close - Open), но всё равно скорость меня не устраивает: указатель после переоткрытия ставится на последнюю запись 0,53 секунды (если записей около 200000) - хотелось бы побыстрее. Т.е. если набор данных Таблицы1содержит последние добавленные внешней программой записи и указатель находится в конце, то всё остальное происходит мгновенно. А вот на то, чтобы обеспечить эти два условия (актуальность набора данных и указатель в конце) получается что уходит 0,53 секунды.
До TQuery и TADOQuery ещё не добрался. Попробую.
dimmm вне форума Ответить с цитированием
Старый 18.04.2009, 08:00   #5
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

В таблице есть какокое-нибудь поле-счетчик?
Если есть, то с помощью AdoQuery запоминай номер последней записи, а за тем с помощью того же Query выводи все записи больше этого номера. Тогда скорость обработки должна увеличиться, и не нужно будет сравнивать данные со второй таблицей. а сразу записывать их.
S@fer вне форума Ответить с цитированием
Старый 21.04.2009, 00:56   #6
dimmm
 
Регистрация: 15.04.2009
Сообщений: 7
По умолчанию

Поля-счётчика как такового нет, но есть поле типа Double, значение которого в каждой новой добавленной записи больше, чем в предыдущих записях. Индексировать по нему, как я уже писал, нежелательно. Но! Оказалось, что предложенный вами вариант подходит по скорости, т.к. даже без индексирования запрос на выборку нескольких записей (со значением этого поля большим чем в предыдущей итерации) из 200000 происходит за 0,1 сек., что меня устраивает. Спасибо.
PS Сравнил скорость TQuery и ADOQuery в выполнении моего запроса - оказалась абсолютно одинаковой.
dimmm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Трехзвенная архитектура "клиент-сервер": обновление данных 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