![]() |
|
сделать стартовой | добавить в избранное |
![]() |
Компьютеры, Программирование
Программное обеспечение
Опыт использования ADO для доступа к базам данных форматов MS Access, xBase и Paradox |
Иванов Денис Михайлович Подвигло меня на написание этой статьи то обстоятельство, что когда я приступал к этой работе (я имею в виду использование ADO), я размещал свои вопросы во многих конференциях, а ответов на них не получено до сих пор и, более того, эти же вопросы стали задаваться по новой, а ответов на них как не было, так и нет. На некоторые из них я отвечал, а потом подумал, что не все будут просматривать конференцию целиком, да и когда все сведено в одном месте оно и лучше. Кроме того, толковой литературы по использованию ADO практически нет никакой. Например, мне не удалось найти в солидных по объему книгах г-на Архангельского необходимую мне информацию. Или еще пример - Microsof Press 'Справочник по OLE DB'. Здесь другой уклон - информации много, слишком много, а примеров никаких (но это вообще проблема справок от Microsof - написано много, а примеров использования почти нет). Надеюсь, что те сведения, которые я приведу здесь, помогут коллегам по цеху в решении его задач. Причины перехода от BDE к ADO Итак, чтобы было понятно что к чему, сначала поясню, зачем же понадобился переход к ADO. Я работаю программистом в компании, которая занимается написанием оболочки для создания геоинформационных систем (ГИС). То есть имеется некая красивая карта и необходимо получение каких-то атрибутивных данных по объектам на этой карте размещенным. При этом атрибутивные таблицы не имеют заранее установленной структуры - только некие предустановленные поля, которых пользователь не видит, но которые используются для связи объектов на карте и записей в базе данных. Итак, для хранения атрибутивной информации был выбран формат MS Access, который имеет то обстоятельство, что все таблицы хранятся в одном файле (в отличие от Paradox и Dbase) и не требует при этом запущенного сервера, как, к примеру, I erbase. Необходима также связь с файлами форматов dbf и db для загрузки/выгрузки данных в/из БД. Для написания программы мы используем Delphi 4, а для подключения к файлам БД использовалась BDE. И все это было отлично, но вот появились два важных обстоятельства: Вышел MS Access 2000. BDE отказывается работать с этим форматом. Как мне удалось найти ответ после долгих поисков на сайте I prise - I prise не знает как производить коннект к этому формату. Цитата: 'Для доступа к данным MS Access мы используем DAO 2.5, который не может работать с форматом MS Access 2000. Если Вам необходим доступ к БД формата MS Access 2000, используйте, пожалуйста, компоненты ADO Delphi 5. По нашей (возможно неверной) информации причина здесь в отсутствии официальной документации от Microsof . 2. Была найдена интересная особенность поведения BLOB потоков под управлением Wi dows 4. Допустим, нам необходим доступ к BLOB полям таблиц в БД формата MS Access 97. Как произвести подключение через BDE к MS Access 97 я говорить не буду, т.к. многие знают, а кто не знает, тот легко найдет эту информацию. Итак, подключение произведено. Отлично. Вот фрагмент программы: Var AS ream: BLOBS ream; Da a: I eger; Begi // Открываем таблицу (обычный able) A able.Ope ; // Создаем поток.
AS ream := // Что-либо читаем из него. AS ream.Read(Da a, SizeOf(Da a)); // Освобождаем поток и закрываем таблицу. AS ream.Free; A able.Close; E d; Казалось бы - абсолютно тривиальный код. НО! Строка, где производится чтение из потока, вызывает исключительную ситуацию - 'Ex er al error - EEFFACE'. И в исходных текстах VCL от Delphi 5 мы находим потрясающее объяснение - это, оказывается, 'C Excep io '. Интересно, а при чем тут C ? Единственный ответ, какой я знаю, - Delphi написана на C . Плюс ко всему, если вы запускаете эту программу из-под Delphi - ошибка не возникает, а если запускаете ее прямо в Wi dows - ошибка будет непременно. Я дошел в своих поисках до вызовов прямых вызовов BDE API - вот там-то ошибка и возникает, так что я думаю тут очередная ошибка BDE, хотя я использовал на тот момент самую последнюю версию с сайта I prise - BDE 5.11. Так что, господа, если Вы используете нечто подобное в своих программах, то знайте, что под Wi dows 4.0/Wi dows 2000 Ваши программы работать не будут. Самое интересное, что компоненты из библиотеки VCL, которые используют подобный метод для получения данных (к примеру, DBRichEdi ) тоже не работают! Итак, этих двух причин оказалось достаточно для нашей фирмы, чтобы начать переход от BDE к ADO. ADO и файлы формата MS Access К чему я привел эту цитату - в результате всей этой работы я пришел к выводу, что у нас, программистов, и у Microsof разный взгляд на фразу 'Обеспечивается доступ к данным'. Мы (ну или, по крайней мере, я) в этой фразе видим следующее содержание 'обеспечивается доступ к данным для их просмотра и РЕДАКТИРОВАНИЯ (т.е. редактирование, удаление и добавление новых данных)'. Что имеет в виду Microsof можно только догадываться, но явно, что без особых проблем достигается только просмотр данных. Кроме того, практически все примеры в литературе ограничиваются получением данных именно для просмотра, после чего следует несколько бодрых фраз и все заканчивается. Как говорится выше - разные точки зрения Итак, прежде всего, работа была ограничена условием разработки в Delphi 4. Причин этому много, но к этой статье это отношения не имеет. Просто - программа, разработанная в Delphi 4 должна работать через ADO. Поэтому приступили к поиску компонент, обеспечивающих такую работу. Нашли их довольно много, как платных, так и бесплатных. Все, что будет написано, одинаково и для всех вариантов и даже для Delphi5. Исключение составляет только работа с закладками в Delphi 5. ADO была взята на тот момент самая последняя версия с сайта Microsof - это ADO 2.6. Итак, возьмем файл mdb формата MS Access 97. Его можно сделать с помощью хотя бы самого Access. И создадим там небольшую таблицу, к примеру, такую: Objec ID I eger - идентификатор объекта на карте Objec Descrip io ex (50) - описание объекта на карте Введем туда какие-либо данные (абсолютно все равно какие). Только надо учесть, что в силу специфики работы у нас могут быть описания, которым пока объекты не соответствуют. Такая связка будет выполнена позже пользователем. Ну, попробуем вывести содержимое таблицы в DBGrid. Ага, получилось.
Например, как на картинке: Вроде как все нормально и доступ к данным мы получили. А теперь давайте, вообразим себя пользователями и попробуем что-нибудь исправить или добавить. Например, добавим несколько пустых записей и попробуем внести туда данные. Добавляем. Нормально. Теперь внесем данные и нажмем POS . И что мы видим? Ага. Интересно, а при чем тут ключ, если у нас на таблицу ключ не наложен? Пробуем добавить новую запись, удалить запись без Objec ID. Результат одинаков - все то же сообщение об ошибке. И что же делать? Запускаем MS Access, пробуем там, и видим, что там все отлично. Стало быть, что-то не так мы делаем с ADO. И тут мы вспоминаем, что когда мы создавали таблицу в MS Access, он предлагал создать ключевые поля для этой таблицы. А после долгих поисков в ADO SDK я нашел этому такое объяснение: ADO предполагает, что таблица будет в первой нормальной форме. Если кто не помнит главное требование первой формы - отсутствие повторяющихся записей. В данном случае мы не можем создать ключ на то, что есть. Что же делать? И тут приходит на ум простое решение: добавим еще одно поле, чтобы каждая запись была однозначно определена (т.е. некий внутренний идентификатор). Чтобы не думать о содержимом этого нового поля, делаем совсем просто - пусть это будет автоинкрементное поле, и создадим на него первичный ключ. Отлично! Делаем - все работает. Пока мы не добавляем больше одной записи. Если мы их добавим подряд несколько, мы увидим очень интересную ситуацию как на картинке. Что здесь интересного? А то, что содержимое I er al ID для всех этих записей равно нулю, хотя это автоинкрементное поле! И able.Refresh здесь не помогает! Только закрытие и последующее открытие таблицы приводит к тому, что мы видим то, что и ожидалось. А пока мы не имеем правильных идентификаторов, наличие такого поля не дает ничего. Выше приведенные ошибки будут продолжать сыпаться как из рога изобилия. Но вот только закрывать - открывать таблицу каждый раз после добавления новой записи для того, чтобы автоинкрементное поле принимало правильные значения - это сильно. Так не пойдет. Вот так ADO, подумал я, а давай-ка попробуем MS Access 2000. И тут оказалось, что там все нормально работает: добавляем запись, делаем сохранение (Pos ) автоинкрементное поле тут же принимает правильное значение. В результате я могу сделать только один вывод - Microsof активно, всеми доступными средствами, пытается заставить пользователей переходить к своим новым продуктам. А вот почему в Access все нормально работает - это загадка. Я думаю, что сам-то он пользуется какими-то своими методами, либо в процессе работы у него есть некий идентификатор записи типа только что придуманного нами. Ну а чтобы пользователь не видел этого внутреннего идентификатора (он ведь нужен только нам) делаем это поле невидимым. Надеюсь, что все знают, что это делается через Field.Visible := FALSE. Кто-нибудь может возразить: а зачем нам такой идентификатор, мы можем записи идентифицировать по каким-нибудь своим полям. Ради Бога! Но тут есть еще одна проблема и эта проблема называется закладки.
Другая проблема DB2/400 (как и любой другой базы данных) обработка сложных типов данных, таких как объекты. При повсеместном переходе на использование распределенных объектов, база данных должна будет работать с этими абстрактными типами данных. Хотя крайне маловероятно, что кто-либо из основных производителей баз данных до конца столетия откажется от реляционной модели в пользу полностью объектно-ориентированной, все же нужно работать на опережение. Несмотря на то, что в данной области по-прежнему нет стандартов, организации типа OMG вносят предложения по методам хранения объектов или их компонентов в реляционной базе данных с возможностью выборки через систему управления объектно-ориентированной базой данных. IBM также рассматривает аналогичные предложения по базе DB2. Если эти предложения будут приняты, мы их реализуем. DB2/400 будет оставаться опорой для приложений AS/400 в версии 4. В базы данных AS/400 будут внесены изменения, повышающие производительность и расширяющие функциональные возможности как больших, так и малых баз данных
2. Работа с базами данных в MS Excel
3. Создание баз данных в Microsoft Access
4. Бази даних в Excel, Access з викликами на VBA
5. Использование Internet/intranet технологий для организации доступа к базам данных
9. Организация удаленного доступа к распределенным базам данных
10. Организация доступа к базам данных в Интернет
11. Система баз данных MS Access
12. Разработка базы данных «Магазин бытовой техники “Электрон” средствами СУБД MS Access»
14. Информационные технологии создания и обработки баз данных с помощью MS Access XP
15. Проектирование баз данных MS Access
16. Проектирование, создание и управление базой данных «Переплетная мастерская» в пакете MS Access
18. Система баз данных MS Access
19. Табличный процессор Excel. Система управления базой данных MS Access. Векторный редактор CorelDraw
20. Базы данных и их использование
25. Современные системы управления базами данных
26. Создание и описание базы данных "СТУДЕНТЫ" (Отчет по курсу "Базы данных")
27. Использование макросов для программирования в MS ACCESS
28. Базы данных Microsoft Access
29. Лекции по теории проектирования баз данных (БД)
31. Система управления базами данных ACCESS
32. База данных - Бактериологическая испытательная лаборатория Боханского района
33. Создание базы данных "Библиотека"
36. Системы принятия решений, оптимизация в Excel и базы данных Access
41. База данных страховой компании
42. База данных
44. Visual C++. Бази даних Укр.
45. Ответы на теоретические вопросы по предмету База данных
46. Инфологическая модель баз данных "Сущность-связь"
47. Пример проектирования базы данных "Библиотека"
48. Основы работы с базами данных Delphi
49. Параллельные машины баз данных
50. Инфологическое моделирование базы данных
52. Web-серверы, базы данных в Интернет, Поиск информации в Интернет, Основные системы и средства
53. База данных Бюро знакомств
57. Перенос Базы Данных на WEB-сервер
60. Создание базы данных в интегральном пакете Works
61. Создание учебной базы данных Телефонный справочник в Access 97
63. Некоторые аспекты обеспечения эффективности работы системы управления базами данных
64. Манифест систем объектно-ориентированных баз данных
66. Создание файла и таблиц базы данных мастером и по заданной логической модели
67. Современные системы управления базами данных
69. Создание базы данных «расписание»
73. Правовая охрана программ для ЭВМ и баз данных
74. Автоматизация базы данных для ООО "ОриенБанк"
75. База даних клієнтів і замовлень
76. База даних по обліку вогнепальної зброї
77. База даних по приватних підприємствах регіону
78. База даних фільмотеки: розробка проекту
79. База данных
80. База данных "Автосервис" в среде Borland Delphi 6.0.
82. База данных "Пассажирские железнодорожные перевозки"
84. База данных "Учет готовой продукции на складе"
85. База данных аптеки готовых лекарственных форм
89. База данных компьютерного магазина
90. База данных по учету металлопродукции на платформе SQL Server
92. База данных станции технического обслуживания автомобилей
93. База данных: "Деканат: дистанционное обучение"
94. Базы данных
95. Базы данных
96. Базы данных и информационные технологии
97. Базы данных и управление ими