Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 199

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Суть проблемы:
Один компьютер - на нём установлена сторонняя прога работающая с БД Paradox (база лежит на этом же компьютере). Программа запускается в автомате и изменить её настройки не представляется возможным.
Необходимо написать программу, которая будет запускаться на этом же компьютере и аккуратненько (слово аккуратненько три раза подчёркнуто :) ) поглядывать в таблицы, но не мешая работать основной.
Все пробы подключиться в к любой таблице Paradox (при запущенной основной программе !!!), даже если эти таблица просто скопирована в другой каталог не приводит к успеху.
Выдаётся ошибка - An error occurred while attempting to initialize the Borland Database Engine (error $210D).
По отдельности всё работает замечательно.
Имеются ли механизмы доступа через Делфи к подобным базам ???
З.Ы. Редактирование каких-либо системный настроек допустимо. Может вопрос и глупый, но я никогда не работал с BDE :(

Ice-Breaker Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ice-Breaker (статус: Посетитель)
Вопрос отправлен: 15 декабря 2008, 09:41
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: ANBsoft

Здравствуйте, Ice-Breaker!
Если скопировать таблицу в другой каталог, все должно работать, сам так делал для загрузки продаж из "Торговли и сервиса". Возможно нужно копировать еще файл *.mdx.
Привожу кусок кода, который это делал.

Приложение:
  1.  
  2. if Not DirectoryExists(PathTemp) then
  3. if Not CreateDir(PathTemp) then begin
  4.  
  5. Exit;
  6. end;
  7. FormData.DBKassa.Params[0]:='PATH='+PathTemp;
  8. TSPath:=LoadIniStrN('Main','TS_Path','C:TSCSDB_Net');
  9. if Not FileExists(TSPath+'Sells.dbf') then begin
  10.  
  11. Exit;
  12. end;
  13. if (Not CopyFile(PChar(TSPath+'Sells.dbf'),PChar(PathTemp+'Sells.dbf'),False)) or
  14. (Not CopyFile(PChar(TSPath+'Sells.mdx'),PChar(PathTemp+'Sells.mdx'),False)) then begin
  15.  
  16. Exit;
  17. end;
  18.  


Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 15 декабря 2008, 10:07

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Ice-Breaker!
Рекомендую оставить BDE в стороне и не юзать его.
Конечно, таблица скопированная с живой работающей системы может находиться в "промежуточном" состоянии. То есть, когда часть файла обновилась, а часть нет. И надо быть готовым к этому.
А для доступа к таблице рекомендую попробовать Компонент TDbf. Если компонент будет "плохо реагировать" на повреждённую таблицу, то всегда можно "поправить" в исходном коде.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 15 декабря 2008, 11:18


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 17 декабря 2008, 11:13; участников в обсуждении: 4.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 15 декабря 2008, 11:17 [#1]:

Каким образом (с помощью какого инструмента) пытались подключиться к БД при работающей основной программе, если не средствами Дельфи? Возможно была попытка изменить параметры алиаса БД при существующем подключении к этой базе. И что значит - по отдельности все работает? Работает Ваша программа, когда не запущена основная с основной базой или с копией? Если с основной, то значит в основной программе используется эксклюзивный доступ к БД.
Ice-Breaker

Ice-Breaker (статус: Посетитель), 16 декабря 2008, 09:26 [#2]:

Бубырь Александр Николаевич
Способ не помог (копирование таблицы) ... В принципе делал тоже самое и в своей проге ... Такая же ошибка. :(

Вадим К
Сама идея открывать таблицы не через BDE мне понравилось, но сам компонент работает только с dBASE, Paradox файлы он не видит :(. А есть что-то подобное только для парадокса ?

Мережников Андрей
Подключаюсь компонентами BDE в Делфи...
<Если с основной, то значит в основной программе используется эксклюзивный доступ к БД.> ... Вот это меня и пугает ... Потому как при работе основной программы я даже не могу зайти в "ВDE Администрирование". Есть способ это обойти?
Вадим К

Вадим К (статус: Академик), 16 декабря 2008, 10:15 [#3]:

Ну, в принципе никто не обещал, что к работающей базе можно будет подключиться. А находиться она в эксклюзивном доступе или нет - не имеет значения. Ещё раз обясню. В тот момент, пока файл БД открыт программой, часть данных может находиться в файле, часть в кеше, часть в памяти. Данные могут быть несогласованными - то есть нарушающими целостность БД. Это абсолютно нормальное явление. Сервер БД не пишет каждый раз изменения на диск. Это очень чревато значительной потерей скорости.
Решения я вижу такие
а) Научиться читать "поломанные таблицы". Сложно, но увлекательно. Как положительная сторона - потом будете большим специалистом по починке этого типа БД. Ведь иногда в файле БД надо поправить 2-3 байта и программа "скушает" его, а сами данные в файле могут стоить тысячи. Специалисты подобного профиля очень редки.
б) Менять способ. Например с быстрой остановкой программы, копированием и повторным запуском.
в) делать "внедрение" в программу. Тоже весьма увлекательно, но достаточно сложно.
д) может ещё есть вариант, но я пока не придумал...
Галочка "подтверждения прочтения" - вселенское зло.
ANBsoft

ANBsoft (статус: Студент), 16 декабря 2008, 10:37 [#4]:

Проверьте правильность подключения к базе в своей программе.
Возможно Вы через подключаетесь через алиас и в итоге пытаетесь работать не с копией, а с оригиналом таблицы.
Для этого не заполняем поле алиаса, а напрямую указываем путь к таблице в параметрах TTDataBase.
В моем примере это была строка:
FormData.DBKassa.Params[0]:='PATH='+PathTemp;
Существует вероятность получить при копировании нецелостную базу, но в моем случае это было неважно:
1) размер таблицы был единицы мегабайт и современные компьютеры копируют ее за долю секунды;
2) насколько я знаю в обычной работе таблицы dbf не упаковываются (не удаляются записи помеченные к удалению), следовательно новые записи дописываются только в конец файла, в моем случае таблица работала только на добавление новых записей, а загрузка данных проводилась за предыдущие дни, следовательно новые записи не интересуют и не важно, есть они в таблице или нет.
Вадим К

Вадим К (статус: Академик), 16 декабря 2008, 11:06 [#5]:

Хватит людям рекомендовать BDE! Он только создаёт лишних проблем.
Галочка "подтверждения прочтения" - вселенское зло.
ANBsoft

ANBsoft (статус: Студент), 16 декабря 2008, 11:23 [#6]:

1) никто и не рекомендует, мы предлагаем варианты решения проблемы
2) чужая программа уже работает через ВДЕ, так что от него уже никуда не денешься, и выбирать не приходится
А работать или нет через ВДЕ из своей программы или через сторонние компоненты - особой разницы нет. За 15 лет использования БДЕ, он был проверен десятками тысяч людей и работал, можно ли такое сказать о сторонних компонентах и их недоработках?
Вадим К

Вадим К (статус: Академик), 16 декабря 2008, 11:35 [#7]:

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

Мережников Андрей (статус: Абитуриент), 16 декабря 2008, 18:27 [#8]:

С какой периодичностью надо "подсматривать" за базой? Можно ведь перед запуском основной программы скопировать базы. тогда не должно быть проблем с целостностью.
Ice-Breaker

Ice-Breaker (статус: Посетитель), 17 декабря 2008, 09:06 [#9]:

Да в том-то и проблема, что следить надо постоянно ...
Тут ещё один непонятный нюанс вылез. Моя программа может спокойно запускаться в любой момент, не в зависимости работает ли основная прога или нет и может ожидать пока работа основной не закончиться (вернее пока её не выгрузят). НО!!!! Основная прога ну ни как не хочет загружаться если запущена моя прога, даже если она уже позакрывала все возможные конекты к парадоксу.
Вадим К

Вадим К (статус: Академик), 17 декабря 2008, 11:13 [#10]:

Значит не по закрывала. Лучше всё таки копировать файлы БД в отдельное место и после этого запускать основную программу. А ваша пусть разбирается с базой, но скопированной в отдельное место.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.02 сек.