Практикум прикладного программирования на MFC и C++ в среде VS.NET

Создание СУБД локальной базы данных средствами BDE

Разбить на страницы
Показывать лекцию целиком
Файлы к данной лабораторной работе, Вы можете скачать здесь.

СУБД - система управления базой данных. Создадим приложение, обеспечивающее управление данными по успеваемости школьников гипотетической школы на локальном компьютере, используя механизм BDE (Borland Database Engine) - процессор баз данных.

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

Пользователем этого приложения должен быть работник школы (лучше - секретарь директора), в обязанность которого входит:

  • Первичное заполнение БД сведениями об учащихся
  • Первичное заполнение БД сведениями о преподаваемых предметах
  • Оперативное занесение текущих оценок по предметам
  • Выборка отчета по успеваемости
  • Ведение архива
  • Наша задача, как разработчиков, проанализировать задачу с привлечением работников школы, а затем реализовать ее по следующему плану:

  • Спроектировать базу данных
  • Создать базу данных
  • Спроектировать приложение для управления данными
  • Проектирование базы данных

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

    Список учеников SCHOOL
    Field Name Type Size Пояснения
    ID_SCHOOL Numeric 4 Идентификатор ученика
    NAME Character 30 ФИО ученика
    NUM_CLASS Character 2 Номер класса
    SUB_CLASS Character 1 Индекс класса
    ADDRESS Character 20 Домашний адрес
    BIRTHDAY Date Дата рождения
    Список телефонов PHONE
    Field Name Type Size Пояснения
    PHONE Character 20 Связанный с учеником телефон
    ID_SCHOOL Numeric 4 Идентификатор ученика
    OWNER Character 20 Чей телефон
    CONNECT Logical 1 Участвует ли в процессе обслуживания
    Список предметов TOPIC
    Field Name Type Size Пояснения
    ID_TOPIC Numeric 4 Идентификатор предмета
    TOPIC Character 20 Изучаемый предмет
    NUM_CLASS Character 2 Номер класса
    SUB_CLASS Character 1 Индекс класса
    ID_TUTOR Numeric 3 Идентификатор учителя
    TUTOR Character 20 Учитель
    TERM Numeric 1 Учебная четверть
    Список оценок по предметам VALUATION
    Field Name Type Size Пояснения
    ID_SCHOOL Numeric 4 Идентификатор ученика
    DATE Date Текущая дата
    ID_TOPIC Numeric 4 Идентификатор предмета
    VALUATION Numeric 4 Оценка

    При формировании таблиц базы данных следует соблюдать три общепринятых принципа, которые обеспечивают приведение структуры к нормальным формам

  • В каждой ячейке таблицы должно содержаться единственное значение атрибута (поля)
  • Все атрибуты, не являющееся частью первичного ключа, полностью от него функционально зависимы
  • Атрибуты должны зависить только от ключа и не от чего более (взаимная связь атрибутов должна быть исключена)
  • Создание псевдонима базы данных

    Прежде, чем начать разработку приложения, нужно сделать так, чтобы при запуске оно автоматически узнавало логическое имя своей базы данных. Это логическое имя называется псевдонимом ( Alias ) BDE. Оно необходимо для обеспечения работы механизма BDE. Использование логического имени позволяет перемещать каталог с базой на новое место или другой компьютер, а для подключения к исполнимому коду приложения достаточно эту базу зарегистрировать внешней утилитой, указав место размещения, поддерживаемый драйвер и тот же псевдоним. В самом же приложении ничего переделывать не нужно.

    Механизм BDE действует как интерфейс между базой данных и приложением, обеспечивая работу невидимых компонентов доступа. BDE реализован в виде набора DLL -файлов. Взаимодействие программных элементов приложения не зависит от конкретной реализации базы данных благодаря BDE, который обеспечивает доступ к данным на нижнем уровне иерархии управления данными.

    Псевдоним BDE аналогичен DSN (Data Source Name) источнику данных ODBC фирмы Microsoft. Это набор параметров, определяющих способ установления связи с базой данных или СУБД, который разработчик должен настроить при его создании. В этом случае приложению безразлично, где физически раположена та или иная база данных, а часто безразлична и СУБД, создавшая и обслуживающая эту базу данных. При переносе базы администратору базы достаточно внести соответствующую информацию в псевдоним.

    BDE по псевдониму находит подходящий для указанной базы данных драйвер. Драйвер - это вспомогательная программа (обычно поставляемая разработчиками баз данных), которая понимает, как обращаться к базам данных определенного типа. Если в BDE имеется собственный драйвер, соответствующий СУБД, то BDE связывается через него с базой данных и с нужной таблицей в ней, обрабатывает запрос пользователя и возвращает в приложение результаты обработки. BDE поддерживает естественный доступ к таким базам данных, как Microsoft Access, FoxPro, Paradox, dBase.

    При работе с базами данных часто применяется кэширование всех изменений. Это означает, что все изменения данных (вставка/удаление записей), проводимые пользователем, вначале выполняются не с самой базой, а с виртуальной таблицей в оперативной памяти или виртуальном диске. И только после окончательных проверок пользователь может сохранить изменения в базе или отказаться от сохранения.

    При сбросе кэша в базу используется механизм транзакций (логически связанных операций, которые должны рассматриваться как единая группа, в которой при сбое хотя бы одной операции действия всей группы отменяются и происходит откат состояния данных в позицию, которая была до начала транзакции).

    Имеются три альтернативных пути создания, просмотра и редактирования псевдонимов с помощью трех различных программ, которые можно вызвать из главного меню оболочки:

  • Tools/Database Desktop
  • Tools/BDE Administrator
  • Database/Explore
  • Программы являются самостоятельными утилитами и их можно вызвать напрямую, а при настройке базы на другом компьютере их нужно взять с собой и запускать там. Они расположены

    C:\Program Files\Common Files\Borland Shared\Database Desktop\dbd32.exe C:\Program Files\Common Files\Borland Shared\BDE\bdeadmin.exe C:\Program Files\Borland\CBuilder6\Bin\dbexplor.exe

    Вспомните, что для запуска Администратора ODBC фирмы Microsoft необходимо запустить режим командной строки, выбрав меню Пуск/Выполнить, и в поле ввода внести команду odbcad32.

    Автоматически создаваемые псевдонимы рабочего и частного каталогов

    Прежде, чем приступить к созданию новых псевдонимов, нужно упомянуть о двух псевдонимах, автоматически создаваемых BDE. Эти псевдонимы размещаются в двух каталогах: рабочем ( working ) и частном ( private ).

    Рабочий каталог используется для совместной работы всех пользователей. Database Desktop создает его в момент установки на компьютере средa C++Builder с путем

    C:\Program Files\Common Files\Borland Shared\Database Desktop\WorkDir

    Он имеет псевдоним WORK. Изменить рабочий каталог можно с помощью Database Desktop, выполнив в нем команду меню File/Working Directory.

    Появится окно для смены места хранения псевдонима

    При смене рабочего каталога псевдоним WORK автоматически будет подразумевать этот новый каталог. Если вы - единственный или основной пользователь Database Desktop, то полезно установить в качестве рабочего тот каталог, внутри которого или в подкаталогах которого сосредоточено большинство ваших баз данных.

    Личный ( private ) каталог также создается автоматически при уcтановки Database Desktop там же, где и рабочий каталог. Он предназначен для хранения личных таблиц и других объектов пользователя, не предназначенных для всеобщего обозрения. Он имеет псевдоним PRIV. Изменить рабочий каталог также можно с помощью Database Desktop, выполнив в нем команду меню File/Private Directory.

    Создание и просмотр псевдонимов баз данных в Database Desktop

    Псевдонимы баз данных могут создаваться в C++Builder двух видов:

  • Открытые - доступные приложению из любого каталога при его работе на компьютере пользователя. Они хранятся в файле C:\Program Files\Common Files\Borland Shared\BDE\IDAPI32.CFG
  • Псевдонимы проекта - доступные только при работе в конкретном каталоге и хранятся в этом каталоге в файле IDAPI.CFG. Используя псевдонимы проекта, мы можем в разных каталогах разместить файлы конфигурации с разными псевдонимами и в зависимости от того, какой каталог мы назначим рабочим, будем иметь разные наборы псевдонимов.
  • Псевдонимы можно просматривать и создавать в Database Desktop, выполнив в этой программе команду меню Tools/Alias Manager (Диспетчер псевдонимов)

    Появится окно диспетчера псевдонимов, вид которого зависит от того, псевдоним какой базы данных просматривается.

    Индикатор Public alias (открытый псевдоним) в верхней части окна показывает, будет ли создаваться открытый псевдоним или псевдоним проекта. Выпадающий список Database alias позволяет выбрать псевдоним из уже созданных. То, какие псевдонимы в нем видны, определяется группой радиокнопок справа.

    Группа радиокнопок
    Show public aliases only В списке отображаются только открытые псевдонимы
    Show project aliases only В списке отображаются только псевдонимы проекта
    Show all aliases В списке отображаются псевдонимы обоих типов

    Кнопка Browse позволяет установить путь размещения таблиц базы данных. Кнопка Remove удаляет выбранный псевдоним. Кнопка Save as... позволяет перезаписать копию псевдонима на новое место и под другим именем.

    Для создания псевдонима с помощью Database Desktop нужно выполнить следующие шаги:

  • Установить или убрать опцию Public alias
  • Выбрать драйвер базы данных в списке Driver type
  • Установить через кнопку Browse путь размещения таблиц базы
  • Щелкнуть по кнопке New и в окне редактирования Database alias ввести имя нового псевдонима (если создается псевдоним базы с однотипными характеристиками, то выгоднее вначале выбрать существующий псевдоним, а затем изменить его имя и щелкнуть по кнопке Keep New, чтобы сохранить новую информацию)
  • Сохранить всю информацию, щелкнув по кнопке Save as.., и выйти из диалога
  • Создание и просмотр псевдонимов баз данных в BDE Administrator

    Программа BDE Administrator позволяет просматривать, редактировать и создавать псевдонимы баз данных различных типов, подключая к ним информацию о драйверах и их настройку.

    Окно программы имеет две страницы (вкладки): Databases - базы данных и Configuration - конфигурация. На вкладке Databases в левой панели расположено дерево псевдонимов баз данных. Справа представлены характеристики выделенного псевдонима, число и смысл которых зависит от закрепленного за этим псевдонимом драйвера.

    Для драйвера типа STANDARD набор характеристик псевдонима минимальный. Тип драйвера STANDARD можно использовать для таблиц Paradox, dBase, FoxPro и для текстов ASCII (Американский стандартный код обмена информацией).

    Характеристики драйвера типа STANDARD
    DEFAULT DRIVER

    Можно установить подключение одного из следующих драйверов:

  • PARADOX - таблицы в файлах *.db
  • DBASE - таблицы в файлах *.dbf
  • FOXPRO - таблицы в файлах *.dbf
  • ASCIIDRV - таблицы в файлах *.txt
  • ENABLE BCD Определяет, должен ли механизм BDE транслировать числовые поля в значения с плавающей точкой, или в коды BCD. BCD позволяет избежать ошибок округления. Если ENABLE DCD установить в TRUE, то поля типа Numeric и Decimals преобразуются в коды BCD.
    PATH Путь к месту размещения таблиц базы данных

    В правой панели можно изменить значения только тех параметров, имена которых не выделены жирным шрифтом. После задания значений параметров через контекстное меню правой панели окна можно сохранить изменения командой Apply (Прменить) команда Delete удаляет псевдоним, команда Save as... копирует измененный псевдоним.

    Вкладка Configuration (конфигурация) позволяет изменить какие-то параметры выбранного драйвера и установить системные параметры, определяющие, как преобразовываются строки с обозначением дат, времени и чисел в соответствующие значения.

    Создание и просмотр псевдонимов баз данных в SQL Explorer

    Вызов этой программы осуществляется из главного меню C++Builder командой Database/Explore. Окно программы также состоит из двух панелей

    В левой панели во вкладке Database также отображается дерево зарегистрированных псевдонимов. Выделив интересующий псевдоним, в правой панели можно увидеть его параметры, которые при желании можно изменить. Выделив корневой узел в левой панели, можно с помощью команды меню Object/New этой программы создать новый псевдоним

    При этом вначале будет показано диалоговое окно выбора драйвера, а затем появится диалоговое окно, ничем не отличающееся от рассмотренного ранее в BDE Administrator.

    Однако возможности SQL Explorer по просмотру и модификации не ограничиваются только псевдонимами. Выбрав в левой панели интересующий псевдоним, можно посмотреть, что хранится в закрепленной за ним базе данных (таблицы, индексы и др.) и даже редактировать записи.

    Создание псевдонима DBShool для базы BaseSchool

    Создадим псевдоним для нашей базы данных.

  • Войдите в место размещения своей лабораторной работы и создайте в нем подчиненный каталог для хранения таблиц базы данных с именем BaseSchool. Это имя мы в дальнейшем будем использовать как имя базы данных.
  • Запустите из меню оболочки утилиту
  • Через меню
  • После нажатия кнопки
  • Справа установите параметр PATH окна псевдонима в значение каталога предполагаемого размещения файлов с данными
  • В правой панели для параметра DEFAULT DRIVER установите значение FOXPRO
  • Нажмите кнопку
  • Создание таблиц базы данных

    Физическая структура базы данных зависит от типа СУБД, который мы принимаем для хранения данных и управления ими. Обычно имя базы данных совпадает с каталогом, где хранятся все таблицы, составляющие эту базу. Создадим структуру базы, которая будет основой для наполнения данными. Структуру таблиц можно создадим с помощью инструмента Database Desktop оболочки C++Builder 6 через меню Tools. Если на вашем компьютере его там нет, то присоедините его к оболочке через команду Tools/Configure Tools...

  • Вызовите через меню
  • В появившемся подменю имеются три команды

    Пункты меню File/New
    Командаменю Пояснения
    QBE Query Визуальный построитель запросов и запись этих запросов в файл
    SQL File Создание запроса на SQL и запись его в файл
    Table Создание новой таблицы
  • Выполните команду
  • После нажатия кнопки OK появится диалоговое окно для задания параметров структуры создаваемой таблицы. Для каждого поля таблицы выбранного типа dBASE IV указывается

  • Field Name - идентификатор поля
  • Type - тип данных поля
  • Size - размер хранимых данных
  • Decimals - число значащих цифр после запятой
  • Тип поля можно выбирать из контекстного меню для этого поля, щелкнув правой кнопкой мыши на значении типа, или вводом с клавиатуры начальных символов типа

  • Создайте структуру таблицы Список учеников SCHOOL Field Name Type Size Пояснения ID_SCHOOL Numeric 4 Идентификатор ученика NAME Character 30 ФИО ученика NUM_CLASS Character 2 Номер класса SUB_CLASS Character 1 Индекс класса ADDRESS Character 20 Домашний адрес BIRTHDAY Date Дата рождения
  • Щелкните по кнопке
  • Опция Display table обеспечивает немедленное автоматическое открытие таблицы после ее сохранения. Вторая опция Add data to new table доступна в случае, если производилось не создание таблицы, а изменение ее структуры.

    После щелчка по кнопке Сохранить в созданном ранее каталоге BaseSchool появится файл таблицы SCHOOL.dbf. Проверьте это.

  • Подобным же образом создайте файлы для остальных таблиц разработанной структуры, заполнив диалоговые окна мастера так, как показано ниже
    Список телефонов PHONE
    Field Name Type Size Пояснения
    PHONE Character 20 Связанный с учеником телефон
    ID_SCHOOL Numeric 4 Идентификатор ученика
    OWNER Character 20 Чей телефон
    CONNECT Logical 1 Участвует ли в процессе обслуживания
    Список предметов TOPIC
    Field Name Type Size Пояснения
    ID_TOPIC Numeric 4 Идентификатор предмета
    TOPIC Character 20 Изучаемый предмет
    NUM_CLASS Character 2 Номер класса
    SUB_CLASS Character 1 Индекс класса
    ID_TUTOR Numeric 3 Идентификатор учителя
    TUTOR Character 20 Учитель
    TERM Numeric 1 Учебная четверть
    Список оценок по предметам VALUATION
    Field Name Type Size Пояснения
    ID_SCHOOL Numeric 4 Идентификатор ученика
    DATE Date Текущая дата
    ID_TOPIC Numeric 4 Идентификатор предмета
    VALUATION Numeric 4 Оценка
  • Теперь мы имеем файлы таблиц базы данных с заданной структурой, расположенных в каталоге BaseSchool и зарегистрированных в системе под псевдонимом DBSchool

    Изменение структуры таблицы и индексирование полей

    Для быстрого поиска нужных записей в таблице часто применяют индексные файлы. В них содердится информация о значениях одного или нескольких полей, упорядоченная по значениям этих полей. Одновременно содержится и номер записи в основной таблице, где содержится соответствующее значение поля или полей. Такие файлы небольшие и автоматически сортируются для поддержки актуального состояния. Это избавляет от необходимости физически сортировать саму таблицу с данными. Зато можно создавать несколько индексных файлов для одной и той же таблицы, где записи будут упорядочены по нужному полю для быстрой их выборки из основного поля.

    Если индекс создается по ключевому полю, то он называется первичным, индексы для других полей называются вторичными.

    Создадим несколько индексных файлов для таблицы SCHOOL.dbf.

  • Через меню Tools запустите утилиту Database Desktop и выполните команду File/Open/Table.
  • В появившемся диалоговом окне Open Table в раскрывающемся списке установите псевдоним ( Alias ) в значение DBSchool
  • Выделите файл-таблицу SCHOOL.dbf и щелкните по кнопке Открыть. Откроется таблица SCHOOL, созданная нами ранее.
  • Выполните команду меню
  • Проверьте, чтобы в выпадающем списке
  • Индикатор Maintained обеспечивает режим автоматического изменения индекса при редактировании связанной таблицы.

    После щелчка по кнопке OK появится окно с предложением определить имя индекса

  • Оставьте значение по умолчанию, равное имени индексируемого поля.
  • Аналогичным образом создайте индекс для поля BIRTHDAY
  • После создания двух индексов окно Database Desktop должно выглядеть так

  • Щелкните по кнопке Save и сохраните результаты редактирования.
  • Зайдите в каталог размещения базы и убедитесь, что появился новый файл для хранения созданных индексов
  • Обзор компонентов C++Builder 6, используемых для связи с локальными базами данных

    Взаимодействие с базой данных обеспечивается рядом визуальных и невизуальных (неотображаемых во время выполнения программы) компонентов, размещенных во вкладках палитры компонентов оболочки C++Builder 6. Главным посредником, осуществляющим обмен информацией между компонентами визуализации данных и компонентами, непосредственно связанными с базой данных, является компонент DataSource (источник данных). Он находится во вкладке Data Access палитры компонентов

    Другие компоненты, которые нам в дальнейшем понадобятся и которые обеспечивают непосредственную связь с данными при реализации механизма BDE, находятся во вкладке BDE палитры компонентов

    Связь этих компонентов друг с другом и локальной базой данных можно представить схемой

    Компоненты "Наборы данных" ( data set ) непосредственно связываются с базой, руководствуясь информацией псевдонима, в котором вместе с местом расположения таблиц указан тип используемого драйвера. К этой группе относятся такие компоненты как Table, Query, StoredProc, BDEClientDataSet. Они находятся во вкладке BDE.

    Нам не потребуются компоненты Query или StoredProc до тех пор, пока мы не начнем писать свои собственные SQL -процедуры или обращаться к процедурам, хранимым на сервере. Можно и без SQL открывать таблицы баз данных в любом из локальных или удаленных форматов, поддерживаемых C++Builder, используя только компонент Table.

    Компонент "Источник данных" ( data source ) осуществляет обмен информацией между компонентами "Наборы данных" и компонентами визуализации и управления данными. Этот компонент так и называется DataSource (вкладка Data Access ). С данными базы непосредственно работают компоненты набора данных, но они не могут передать данные непосредственно интерфейсным компонентам. Эта передача осуществляется через посредника - DataSource.

    К интерфейсным компонентам визуализации и управления данными относятся DBGrid, DBText, DBEdit, DBListBox, DBComboBox, DBCheckBox и множество других. Все они находятся во вкладке Data Controls. Интерфейсные компоненты работают на стороне пользователя. Они отображают данные на экране в удобной форме и позволяют их изменять. Они представляют собой аналоги элементов управления, используемых в обычных приложениях. Интерфейсные компоненты также обращаются к данным через посредника DataSource.

    Помимо указанных компонентов в приложении может размещаться компонент Database. Этот компонент в основном используется в сетевых приложениях, работающих на платформе клиент/сервер. Он обеспечивает некоторые дополнительные возможности, которые мы вольны использовать или неиспользовать, такие как: общение с удаленным сервером, реализацию транзакций и работу с паролями. Но в то же время он не является неотъемлемой частью приложения, работающего с базой данных. C++Builder автоматически создает экземпляр Database для каждой используемой в приложении базы данных, как и экземпляр компонента Session. Оба этих компонента находятся во вкладке BDE.

    Нам не потребуется компонент Session до тех пор, пока мы не начнем разрабатывать многопоточные приложения для работы с базами данных. Многопоточные приложения открывают одновременно несколько каналов выполнения. Это означает, что несколько операций могут выполняться в одно и то же время. Обычно приложения, работающие с базами данных, не делают многопоточными, поэтому редко приходится создавать и использовать компонент Session явно.

    Основные свойства компонента Table

    Основным компонентом, непосредственно работающим с данными, является Table. Он устанавливает соединение между приложением и таблицей с данными, а также используется для добавления, изменения и удаления строк в таблице базы данных. Имеет свойства, часть из которых доступна в режиме проектирования, а часть - программно при выполнении приложения.

    Основные свойства компонента Table
    Свойство Описание
    Active Открывает и закрывает соединение с таблицей. Если в режиме проектирования значение свойства установить в true, то можно увидеть "живые данные" таблицы, что во многих случаях является удобным для разработчика приложения. Но в законченном приложении во всех таблицах это свойство нужно установить в false, а в событии OnCreate() формы приложения поместить код с установлением этого свойства в true, что откроет соединение с соответствующей таблицей. В событии OnDestroy() формы приложения нужно установить значение свойства вновь в false, что обеспечит закрытие соответствующих файлов базы данных и предотвратить неоправданный расход ресурсов в системе, а при работе в сети - устранит преграду доступа к таблице со стороны других пользователей.
    AutoCalcFields Определяет способ вычислений с использованием полей
    Bof, Eof Bof - показывает, находится ли курсор таблицы перед первой записью, Eof - показывает, находится ли курсор таблицы после последней записи. Эти свойства принимают значение true только тогда, когда курсор выходит за пределы строк таблицы при вызове методов Prior() или Next(). При открытии таблицы свойство Bof также устанавливается в true автоматически.
    CachedUpdates Определяет, будут ли кэшироваться обновленные данные
    DatabaseName Определяет псевдоним BDE, используемый для соединения с базой данных.
    Exclusive Определяет, могут ли другие пользователи обращаться к данной таблице
    FieldCount Возвращает количество полей в таблице
    FieldDefs Содержит редактируемый список используемых в приложении полей таблицы
    Fields Возвращает указанное по индексу поле со всеми характеристиками
    Filter Определяет выражение, используемое для фильтрации записей
    Filtered Определяет, какой способ фильтрации используется: указанный в Filter или OnFilterRecord
    FilterOptions Управляет работой фильтров
    IndexDefs Выдает информацию об индексах базы
    IndexFieldCount Возвращает число полей в текущем индексном ключе
    IndexFieldNames Указывает поля, используемые в качестве индексного ключа
    IndexName Указывает имя используемого индекса
    IndexFields Возвращает указанное по индексу массива поле индексного файла со всеми характеристиками
    KeyExclusive Инвертирует действие функций поиска и установки диапазона
    KeyFieldCount Указывает количество ключевых полей, используемых для поиска
    MasterFields Указывает главные поля в отношении "главный/подчиненный
    MasterSource Указывает главный источник в отношении "главный/подчиненный"
    Modified Показывает, была ли данная запись изменена с момента последнего обновления базы методами Post или Cancel
    ReadOnly Устанавливает режим только чтения данных из источника
    RecordCount Возвращает количество записей в источнике данных
    SessionName Указывает, какой компонент используется для соединения с базой данных
    State Возвращает состояние источника данных
    TableName Указывает физическое имя файла сопоставленной таблицы
    TableType Указывает тип локальной таблицы
    UpdateMode Определяет тип SQL, используемый для изменения данных
    UpdateObject Определяет компонент UpdateSQL для использования совместно с кэшируемыми изменениями

    Основные методы компонента Table

    Основные методы компонента Table
    Метод Описание
    AddIndex() Создает новый индекс
    Append() Добавляет пустую строку к источнику данных, и переводит его в режим редактирования
    AppendRecord() Добавляет строку, используя указанные значения
    ApplyRange() Активизирует диапазон, установленный методами Set() или EditRange()
    ApplyUpdates() Сохраняет кэшированные изменения в базе данных
    BatchMove() Копирует группу строк из одного источника в другой
    Cancel() Отменяет ожидаемое изменение текущей строки
    CancelRange() Отменяет установки, сделанные методами Set() или EditRange()
    CancelUpdates() Отменяет ждущие изменения, занесенные в кэш
    ClearFields() Устанавливает для полей текущей строки значения по умолчанию
    Close() Закрывает источник данных
    CommitUpdates() Уведомляет кэш о сохранении изменений
    CreateTable() Создает новую таблицу
    Delete() Удаляет в таблице текущую запись
    DeleteIndex() Удаляет вторичный индекс
    DeleteTable() Удаляет соответствующую физическую таблицу в базе данных
    Edit() Переводит источник данных в режим редактирования
    EditKey() Позволяет изменять значения ключа поиска
    EditRangeEnd() Позволяет изменять верхний ключевой предел диапазона
    EditRangeStart() Позволяет изменять нижний ключевой предел диапазона
    EmptyTable() Удаляет все строки в источнике данных, оставляя только заголовок
    EnableControls() Разрешает использование интерфейсных компонентов визуализации и управления
    FetchAll() Считывает все ожидающие своей очереди строки базы данных
    FieldByName() Возвращает объект типа TField, используя имя поля в базе данных
    FindFirst() Осуществляет поиск первой записи по условию фильтрации
    FindNext() Осуществляет поиск следующей записи, соответствующей заданному критерию.
    FindKey() Выполняет точный поиск в источнике данных
    FindNearest() Выполняет приближенный поиск с частичным совпадением в источнике данных
    GetFieldNames() Возвращает список полей в источнике данных
    GetIndexNames() Возвращает список открытых индексов
    GotoKey() Выполняет точный поиск в источнике данных по ключу
    GoteNearest() Выполняет приближенный поиск в источнике данных по ключу
    Insert() Вставляет пустую строку перед текущей и позволяет ее редактировать
    InsertRecord() Вставляет строку, используя заданные значения столбцов
    Locate() Осуществляет поиск записи последовательным перебором
    LockTable() Блокирует локальную таблицу для монопольного использования
    Lookup() Осуществляет поиск записи в источнике и возвращает значения ее полей
    MoveBy() Перемещает логический курсор источника данных на заданное количество записей
    Open() Открывает источник данных
    Post() Сохраняет ждущие изменения текущей строки, очищая кэш
    RenameTable() Переименовывает локальную таблицу
    RevertRecord() Отменяет кэшированные изменения текущей строки
    SetKey() Переводит источник данных в режим поиска по ключу
    SetRange() Переводит источник данных в режим поиска по диапазону
    SetRangeEnd() Устанавливает верхний предел диапазона
    SetRangeStart() Устанавливает нижний предел диапазона
    UnlockTable() Разблокирует локальную таблицу от монопольного использования

    Основные события компонента Table

    Основные события компонента Table
    Событие Условие возникновения
    AfterCancel После вызова Cancel
    AfterClose После закрытия источника данных
    AfterDelete После вызова Delete
    AfterEdit После вызова Edit
    AfterInsert После вызова Insert
    AfterOpen После открытия источника данных
    AfterPost После вызова Post
    BeforeCancel Перед выполнением Cancel
    BeforeClose Перед закрытием источника данных
    BeforeDelete Перед выполнением Delete
    BeforeEdit Перед выполнением Edit
    BeforeInsert Перед выполнением Insert и Append
    BeforeOpen Перед открытием источника данных
    BeforePost Перед выполнением Post
    OnCalcField При необходимости ввода значений в вычисляемые поля
    OnDeleteError При ошибке удаления записи
    OnEditError При ошибке редактирования записи
    OnFilterRecord В режиме фильтрации, когда источник данных требует строку
    OnNewRecord При добавлении новой записи в источник данных
    OnPostRecord При ошибке сохранения записи
    OnUpdateError При ошибке во время сохранения кэшированных изменений
    OnUpdateRecord При сохранении каждой строки с помощью ApplyUpdates

    Создание заготовки приложения

    Создадим приложение, в котором реализуем управление созданными ранее таблицами, входящими в состав базы данных.

  • Создайте новый проект и сразу сохраните его в своем каталоге выполнения лабораторной работы. Для этого имя файла user1.cpp измените на uAppBDE, а имя проекта Project1.bpr измените на AppBDE. Это имя в дальнейшем будет иметь исполнимый файл проекта приложения
  • Поместите на новую форму следующие компоненты
    Компонент Вкладка палитры компонентов
    MainMenu Standard
    Table BDE
    DataSource Data Access
    DBGrid Data Controls
  • Настройте свойства компонентов, как приведено в таблице
    Таблица свойств главной формы приложения AppBDE
    Элемент управления Свойство Значение
    Главная форма Name MainForm
    Caption Приложение управления базой данных
    Width 555
    Height 375
    -----------------------------------------------------------------------------------------------------
    MainMenu Name MainMenu
    TMenuItem Name File
    Caption Файл
    -----------------------------------------------------------------------------------------------------
    Table Name School
    DatabaseName DBSchool
    TableName SCHOOL.DBF
    Active true
    -----------------------------------------------------------------------------------------------------
    DataSource Name School DataSource1
    DataSet
    -----------------------------------------------------------------------------------------------------
    DBGrid Name DBGrid1
    DataSource DataSource1
    Align alClient
  • Отредактируйте заголовки полей таблицы. Для этого через контекстное меню компонента
  • Редактор полей заполнится списком полей таблицы. Выделяя последовательно каждое поле в редакторе полей, измените свойство Заголовки полей в представлении таблицы SCHOOL Field DisplayLabel
  • Страницы:
    Файлы к данной лабораторной работе, Вы можете скачать здесь.

    СУБД - система управления базой данных. Создадим приложение, обеспечивающее управление данными по успеваемости школьников гипотетической школы на локальном компьютере, используя механизм BDE (Borland Database Engine) - процессор баз данных.

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

    Пользователем этого приложения должен быть работник школы (лучше - секретарь директора), в обязанность которого входит:

  • Первичное заполнение БД сведениями об учащихся
  • Первичное заполнение БД сведениями о преподаваемых предметах
  • Оперативное занесение текущих оценок по предметам
  • Выборка отчета по успеваемости
  • Ведение архива
  • Наша задача, как разработчиков, проанализировать задачу с привлечением работников школы, а затем реализовать ее по следующему плану:

  • Спроектировать базу данных
  • Создать базу данных
  • Спроектировать приложение для управления данными
  • Проектирование базы данных

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

    Список учеников SCHOOL
    Field Name Type Size Пояснения
    ID_SCHOOL Numeric 4 Идентификатор ученика
    NAME Character 30 ФИО ученика
    NUM_CLASS Character 2 Номер класса
    SUB_CLASS Character 1 Индекс класса
    ADDRESS Character 20 Домашний адрес
    BIRTHDAY Date Дата рождения
    Список телефонов PHONE
    Field Name Type Size Пояснения
    PHONE Character 20 Связанный с учеником телефон
    ID_SCHOOL Numeric 4 Идентификатор ученика
    OWNER Character 20 Чей телефон
    CONNECT Logical 1 Участвует ли в процессе обслуживания
    Список предметов TOPIC
    Field Name Type Size Пояснения
    ID_TOPIC Numeric 4 Идентификатор предмета
    TOPIC Character 20 Изучаемый предмет
    NUM_CLASS Character 2 Номер класса
    SUB_CLASS Character 1 Индекс класса
    ID_TUTOR Numeric 3 Идентификатор учителя
    TUTOR Character 20 Учитель
    TERM Numeric 1 Учебная четверть
    Список оценок по предметам VALUATION
    Field Name Type Size Пояснения
    ID_SCHOOL Numeric 4 Идентификатор ученика
    DATE Date Текущая дата
    ID_TOPIC Numeric 4 Идентификатор предмета
    VALUATION Numeric 4 Оценка

    При формировании таблиц базы данных следует соблюдать три общепринятых принципа, которые обеспечивают приведение структуры к нормальным формам

  • В каждой ячейке таблицы должно содержаться единственное значение атрибута (поля)
  • Все атрибуты, не являющееся частью первичного ключа, полностью от него функционально зависимы
  • Атрибуты должны зависить только от ключа и не от чего более (взаимная связь атрибутов должна быть исключена)
  • Создание псевдонима базы данных

    Прежде, чем начать разработку приложения, нужно сделать так, чтобы при запуске оно автоматически узнавало логическое имя своей базы данных. Это логическое имя называется псевдонимом ( Alias ) BDE. Оно необходимо для обеспечения работы механизма BDE. Использование логического имени позволяет перемещать каталог с базой на новое место или другой компьютер, а для подключения к исполнимому коду приложения достаточно эту базу зарегистрировать внешней утилитой, указав место размещения, поддерживаемый драйвер и тот же псевдоним. В самом же приложении ничего переделывать не нужно.

    Механизм BDE действует как интерфейс между базой данных и приложением, обеспечивая работу невидимых компонентов доступа. BDE реализован в виде набора DLL -файлов. Взаимодействие программных элементов приложения не зависит от конкретной реализации базы данных благодаря BDE, который обеспечивает доступ к данным на нижнем уровне иерархии управления данными.

    Псевдоним BDE аналогичен DSN (Data Source Name) источнику данных ODBC фирмы Microsoft. Это набор параметров, определяющих способ установления связи с базой данных или СУБД, который разработчик должен настроить при его создании. В этом случае приложению безразлично, где физически раположена та или иная база данных, а часто безразлична и СУБД, создавшая и обслуживающая эту базу данных. При переносе базы администратору базы достаточно внести соответствующую информацию в псевдоним.

    BDE по псевдониму находит подходящий для указанной базы данных драйвер. Драйвер - это вспомогательная программа (обычно поставляемая разработчиками баз данных), которая понимает, как обращаться к базам данных определенного типа. Если в BDE имеется собственный драйвер, соответствующий СУБД, то BDE связывается через него с базой данных и с нужной таблицей в ней, обрабатывает запрос пользователя и возвращает в приложение результаты обработки. BDE поддерживает естественный доступ к таким базам данных, как Microsoft Access, FoxPro, Paradox, dBase.

    При работе с базами данных часто применяется кэширование всех изменений. Это означает, что все изменения данных (вставка/удаление записей), проводимые пользователем, вначале выполняются не с самой базой, а с виртуальной таблицей в оперативной памяти или виртуальном диске. И только после окончательных проверок пользователь может сохранить изменения в базе или отказаться от сохранения.

    При сбросе кэша в базу используется механизм транзакций (логически связанных операций, которые должны рассматриваться как единая группа, в которой при сбое хотя бы одной операции действия всей группы отменяются и происходит откат состояния данных в позицию, которая была до начала транзакции).

    Имеются три альтернативных пути создания, просмотра и редактирования псевдонимов с помощью трех различных программ, которые можно вызвать из главного меню оболочки:

  • Tools/Database Desktop
  • Tools/BDE Administrator
  • Database/Explore
  • Программы являются самостоятельными утилитами и их можно вызвать напрямую, а при настройке базы на другом компьютере их нужно взять с собой и запускать там. Они расположены

    C:\Program Files\Common Files\Borland Shared\Database Desktop\dbd32.exe C:\Program Files\Common Files\Borland Shared\BDE\bdeadmin.exe C:\Program Files\Borland\CBuilder6\Bin\dbexplor.exe

    Вспомните, что для запуска Администратора ODBC фирмы Microsoft необходимо запустить режим командной строки, выбрав меню Пуск/Выполнить, и в поле ввода внести команду odbcad32.

    Автоматически создаваемые псевдонимы рабочего и частного каталогов

    Прежде, чем приступить к созданию новых псевдонимов, нужно упомянуть о двух псевдонимах, автоматически создаваемых BDE. Эти псевдонимы размещаются в двух каталогах: рабочем ( working ) и частном ( private ).

    Рабочий каталог используется для совместной работы всех пользователей. Database Desktop создает его в момент установки на компьютере средa C++Builder с путем

    C:\Program Files\Common Files\Borland Shared\Database Desktop\WorkDir

    Он имеет псевдоним WORK. Изменить рабочий каталог можно с помощью Database Desktop, выполнив в нем команду меню File/Working Directory.

    Появится окно для смены места хранения псевдонима

    При смене рабочего каталога псевдоним WORK автоматически будет подразумевать этот новый каталог. Если вы - единственный или основной пользователь Database Desktop, то полезно установить в качестве рабочего тот каталог, внутри которого или в подкаталогах которого сосредоточено большинство ваших баз данных.

    Личный ( private ) каталог также создается автоматически при уcтановки Database Desktop там же, где и рабочий каталог. Он предназначен для хранения личных таблиц и других объектов пользователя, не предназначенных для всеобщего обозрения. Он имеет псевдоним PRIV. Изменить рабочий каталог также можно с помощью Database Desktop, выполнив в нем команду меню File/Private Directory.

    Создание и просмотр псевдонимов баз данных в Database Desktop

    Псевдонимы баз данных могут создаваться в C++Builder двух видов:

  • Открытые - доступные приложению из любого каталога при его работе на компьютере пользователя. Они хранятся в файле C:\Program Files\Common Files\Borland Shared\BDE\IDAPI32.CFG
  • Псевдонимы проекта - доступные только при работе в конкретном каталоге и хранятся в этом каталоге в файле IDAPI.CFG. Используя псевдонимы проекта, мы можем в разных каталогах разместить файлы конфигурации с разными псевдонимами и в зависимости от того, какой каталог мы назначим рабочим, будем иметь разные наборы псевдонимов.
  • Псевдонимы можно просматривать и создавать в Database Desktop, выполнив в этой программе команду меню Tools/Alias Manager (Диспетчер псевдонимов)

    Появится окно диспетчера псевдонимов, вид которого зависит от того, псевдоним какой базы данных просматривается.

    Индикатор Public alias (открытый псевдоним) в верхней части окна показывает, будет ли создаваться открытый псевдоним или псевдоним проекта. Выпадающий список Database alias позволяет выбрать псевдоним из уже созданных. То, какие псевдонимы в нем видны, определяется группой радиокнопок справа.

    Группа радиокнопок
    Show public aliases only В списке отображаются только открытые псевдонимы
    Show project aliases only В списке отображаются только псевдонимы проекта
    Show all aliases В списке отображаются псевдонимы обоих типов

    Кнопка Browse позволяет установить путь размещения таблиц базы данных. Кнопка Remove удаляет выбранный псевдоним. Кнопка Save as... позволяет перезаписать копию псевдонима на новое место и под другим именем.

    Для создания псевдонима с помощью Database Desktop нужно выполнить следующие шаги:

  • Установить или убрать опцию Public alias
  • Выбрать драйвер базы данных в списке Driver type
  • Установить через кнопку Browse путь размещения таблиц базы
  • Щелкнуть по кнопке New и в окне редактирования Database alias ввести имя нового псевдонима (если создается псевдоним базы с однотипными характеристиками, то выгоднее вначале выбрать существующий псевдоним, а затем изменить его имя и щелкнуть по кнопке Keep New, чтобы сохранить новую информацию)
  • Сохранить всю информацию, щелкнув по кнопке Save as.., и выйти из диалога
  • Создание и просмотр псевдонимов баз данных в BDE Administrator

    Программа BDE Administrator позволяет просматривать, редактировать и создавать псевдонимы баз данных различных типов, подключая к ним информацию о драйверах и их настройку.

    Окно программы имеет две страницы (вкладки): Databases - базы данных и Configuration - конфигурация. На вкладке Databases в левой панели расположено дерево псевдонимов баз данных. Справа представлены характеристики выделенного псевдонима, число и смысл которых зависит от закрепленного за этим псевдонимом драйвера.

    Для драйвера типа STANDARD набор характеристик псевдонима минимальный. Тип драйвера STANDARD можно использовать для таблиц Paradox, dBase, FoxPro и для текстов ASCII (Американский стандартный код обмена информацией).

    Характеристики драйвера типа STANDARD
    DEFAULT DRIVER

    Можно установить подключение одного из следующих драйверов:

  • PARADOX - таблицы в файлах *.db
  • DBASE - таблицы в файлах *.dbf
  • FOXPRO - таблицы в файлах *.dbf
  • ASCIIDRV - таблицы в файлах *.txt
  • ENABLE BCD Определяет, должен ли механизм BDE транслировать числовые поля в значения с плавающей точкой, или в коды BCD. BCD позволяет избежать ошибок округления. Если ENABLE DCD установить в TRUE, то поля типа Numeric и Decimals преобразуются в коды BCD.
    PATH Путь к месту размещения таблиц базы данных

    В правой панели можно изменить значения только тех параметров, имена которых не выделены жирным шрифтом. После задания значений параметров через контекстное меню правой панели окна можно сохранить изменения командой Apply (Прменить) команда Delete удаляет псевдоним, команда Save as... копирует измененный псевдоним.

    Вкладка Configuration (конфигурация) позволяет изменить какие-то параметры выбранного драйвера и установить системные параметры, определяющие, как преобразовываются строки с обозначением дат, времени и чисел в соответствующие значения.

    Создание и просмотр псевдонимов баз данных в SQL Explorer

    Вызов этой программы осуществляется из главного меню C++Builder командой Database/Explore. Окно программы также состоит из двух панелей

    В левой панели во вкладке Database также отображается дерево зарегистрированных псевдонимов. Выделив интересующий псевдоним, в правой панели можно увидеть его параметры, которые при желании можно изменить. Выделив корневой узел в левой панели, можно с помощью команды меню Object/New этой программы создать новый псевдоним

    При этом вначале будет показано диалоговое окно выбора драйвера, а затем появится диалоговое окно, ничем не отличающееся от рассмотренного ранее в BDE Administrator.

    Однако возможности SQL Explorer по просмотру и модификации не ограничиваются только псевдонимами. Выбрав в левой панели интересующий псевдоним, можно посмотреть, что хранится в закрепленной за ним базе данных (таблицы, индексы и др.) и даже редактировать записи.

    Создание псевдонима DBShool для базы BaseSchool

    Создадим псевдоним для нашей базы данных.

  • Войдите в место размещения своей лабораторной работы и создайте в нем подчиненный каталог для хранения таблиц базы данных с именем BaseSchool. Это имя мы в дальнейшем будем использовать как имя базы данных.
  • Запустите из меню оболочки утилиту
  • Через меню
  • После нажатия кнопки
  • Справа установите параметр PATH окна псевдонима в значение каталога предполагаемого размещения файлов с данными
  • В правой панели для параметра DEFAULT DRIVER установите значение FOXPRO
  • Нажмите кнопку
  • Создание таблиц базы данных

    Физическая структура базы данных зависит от типа СУБД, который мы принимаем для хранения данных и управления ими. Обычно имя базы данных совпадает с каталогом, где хранятся все таблицы, составляющие эту базу. Создадим структуру базы, которая будет основой для наполнения данными. Структуру таблиц можно создадим с помощью инструмента Database Desktop оболочки C++Builder 6 через меню Tools. Если на вашем компьютере его там нет, то присоедините его к оболочке через команду Tools/Configure Tools...

  • Вызовите через меню
  • В появившемся подменю имеются три команды

    Пункты меню File/New
    Командаменю Пояснения
    QBE Query Визуальный построитель запросов и запись этих запросов в файл
    SQL File Создание запроса на SQL и запись его в файл
    Table Создание новой таблицы
  • Выполните команду
  • После нажатия кнопки OK появится диалоговое окно для задания параметров структуры создаваемой таблицы. Для каждого поля таблицы выбранного типа dBASE IV указывается

  • Field Name - идентификатор поля
  • Type - тип данных поля
  • Size - размер хранимых данных
  • Decimals - число значащих цифр после запятой
  • Тип поля можно выбирать из контекстного меню для этого поля, щелкнув правой кнопкой мыши на значении типа, или вводом с клавиатуры начальных символов типа

  • Создайте структуру таблицы Список учеников SCHOOL Field Name Type Size Пояснения ID_SCHOOL Numeric 4 Идентификатор ученика NAME Character 30 ФИО ученика NUM_CLASS Character 2 Номер класса SUB_CLASS Character 1 Индекс класса ADDRESS Character 20 Домашний адрес BIRTHDAY Date Дата рождения
  • Щелкните по кнопке
  • Опция Display table обеспечивает немедленное автоматическое открытие таблицы после ее сохранения. Вторая опция Add data to new table доступна в случае, если производилось не создание таблицы, а изменение ее структуры.

    После щелчка по кнопке Сохранить в созданном ранее каталоге BaseSchool появится файл таблицы SCHOOL.dbf. Проверьте это.

  • Подобным же образом создайте файлы для остальных таблиц разработанной структуры, заполнив диалоговые окна мастера так, как показано ниже
    Список телефонов PHONE
    Field Name Type Size Пояснения
    PHONE Character 20 Связанный с учеником телефон
    ID_SCHOOL Numeric 4 Идентификатор ученика
    OWNER Character 20 Чей телефон
    CONNECT Logical 1 Участвует ли в процессе обслуживания
    Список предметов TOPIC
    Field Name Type Size Пояснения
    ID_TOPIC Numeric 4 Идентификатор предмета
    TOPIC Character 20 Изучаемый предмет
    NUM_CLASS Character 2 Номер класса
    SUB_CLASS Character 1 Индекс класса
    ID_TUTOR Numeric 3 Идентификатор учителя
    TUTOR Character 20 Учитель
    TERM Numeric 1 Учебная четверть
    Список оценок по предметам VALUATION
    Field Name Type Size Пояснения
    ID_SCHOOL Numeric 4 Идентификатор ученика
    DATE Date Текущая дата
    ID_TOPIC Numeric 4 Идентификатор предмета
    VALUATION Numeric 4 Оценка
  • Теперь мы имеем файлы таблиц базы данных с заданной структурой, расположенных в каталоге BaseSchool и зарегистрированных в системе под псевдонимом DBSchool

    Изменение структуры таблицы и индексирование полей

    Для быстрого поиска нужных записей в таблице часто применяют индексные файлы. В них содердится информация о значениях одного или нескольких полей, упорядоченная по значениям этих полей. Одновременно содержится и номер записи в основной таблице, где содержится соответствующее значение поля или полей. Такие файлы небольшие и автоматически сортируются для поддержки актуального состояния. Это избавляет от необходимости физически сортировать саму таблицу с данными. Зато можно создавать несколько индексных файлов для одной и той же таблицы, где записи будут упорядочены по нужному полю для быстрой их выборки из основного поля.

    Если индекс создается по ключевому полю, то он называется первичным, индексы для других полей называются вторичными.

    Создадим несколько индексных файлов для таблицы SCHOOL.dbf.

  • Через меню Tools запустите утилиту Database Desktop и выполните команду File/Open/Table.
  • В появившемся диалоговом окне Open Table в раскрывающемся списке установите псевдоним ( Alias ) в значение DBSchool
  • Выделите файл-таблицу SCHOOL.dbf и щелкните по кнопке Открыть. Откроется таблица SCHOOL, созданная нами ранее.
  • Выполните команду меню
  • Проверьте, чтобы в выпадающем списке
  • Индикатор Maintained обеспечивает режим автоматического изменения индекса при редактировании связанной таблицы.

    После щелчка по кнопке OK появится окно с предложением определить имя индекса

  • Оставьте значение по умолчанию, равное имени индексируемого поля.
  • Аналогичным образом создайте индекс для поля BIRTHDAY
  • После создания двух индексов окно Database Desktop должно выглядеть так

  • Щелкните по кнопке Save и сохраните результаты редактирования.
  • Зайдите в каталог размещения базы и убедитесь, что появился новый файл для хранения созданных индексов
  • Обзор компонентов C++Builder 6, используемых для связи с локальными базами данных

    Взаимодействие с базой данных обеспечивается рядом визуальных и невизуальных (неотображаемых во время выполнения программы) компонентов, размещенных во вкладках палитры компонентов оболочки C++Builder 6. Главным посредником, осуществляющим обмен информацией между компонентами визуализации данных и компонентами, непосредственно связанными с базой данных, является компонент DataSource (источник данных). Он находится во вкладке Data Access палитры компонентов

    Другие компоненты, которые нам в дальнейшем понадобятся и которые обеспечивают непосредственную связь с данными при реализации механизма BDE, находятся во вкладке BDE палитры компонентов

    Связь этих компонентов друг с другом и локальной базой данных можно представить схемой

    Компоненты "Наборы данных" ( data set ) непосредственно связываются с базой, руководствуясь информацией псевдонима, в котором вместе с местом расположения таблиц указан тип используемого драйвера. К этой группе относятся такие компоненты как Table, Query, StoredProc, BDEClientDataSet. Они находятся во вкладке BDE.

    Нам не потребуются компоненты Query или StoredProc до тех пор, пока мы не начнем писать свои собственные SQL -процедуры или обращаться к процедурам, хранимым на сервере. Можно и без SQL открывать таблицы баз данных в любом из локальных или удаленных форматов, поддерживаемых C++Builder, используя только компонент Table.

    Компонент "Источник данных" ( data source ) осуществляет обмен информацией между компонентами "Наборы данных" и компонентами визуализации и управления данными. Этот компонент так и называется DataSource (вкладка Data Access ). С данными базы непосредственно работают компоненты набора данных, но они не могут передать данные непосредственно интерфейсным компонентам. Эта передача осуществляется через посредника - DataSource.

    К интерфейсным компонентам визуализации и управления данными относятся DBGrid, DBText, DBEdit, DBListBox, DBComboBox, DBCheckBox и множество других. Все они находятся во вкладке Data Controls. Интерфейсные компоненты работают на стороне пользователя. Они отображают данные на экране в удобной форме и позволяют их изменять. Они представляют собой аналоги элементов управления, используемых в обычных приложениях. Интерфейсные компоненты также обращаются к данным через посредника DataSource.

    Помимо указанных компонентов в приложении может размещаться компонент Database. Этот компонент в основном используется в сетевых приложениях, работающих на платформе клиент/сервер. Он обеспечивает некоторые дополнительные возможности, которые мы вольны использовать или неиспользовать, такие как: общение с удаленным сервером, реализацию транзакций и работу с паролями. Но в то же время он не является неотъемлемой частью приложения, работающего с базой данных. C++Builder автоматически создает экземпляр Database для каждой используемой в приложении базы данных, как и экземпляр компонента Session. Оба этих компонента находятся во вкладке BDE.

    Нам не потребуется компонент Session до тех пор, пока мы не начнем разрабатывать многопоточные приложения для работы с базами данных. Многопоточные приложения открывают одновременно несколько каналов выполнения. Это означает, что несколько операций могут выполняться в одно и то же время. Обычно приложения, работающие с базами данных, не делают многопоточными, поэтому редко приходится создавать и использовать компонент Session явно.

    Основные свойства компонента Table

    Основным компонентом, непосредственно работающим с данными, является Table. Он устанавливает соединение между приложением и таблицей с данными, а также используется для добавления, изменения и удаления строк в таблице базы данных. Имеет свойства, часть из которых доступна в режиме проектирования, а часть - программно при выполнении приложения.

    Основные свойства компонента Table
    Свойство Описание
    Active Открывает и закрывает соединение с таблицей. Если в режиме проектирования значение свойства установить в true, то можно увидеть "живые данные" таблицы, что во многих случаях является удобным для разработчика приложения. Но в законченном приложении во всех таблицах это свойство нужно установить в false, а в событии OnCreate() формы приложения поместить код с установлением этого свойства в true, что откроет соединение с соответствующей таблицей. В событии OnDestroy() формы приложения нужно установить значение свойства вновь в false, что обеспечит закрытие соответствующих файлов базы данных и предотвратить неоправданный расход ресурсов в системе, а при работе в сети - устранит преграду доступа к таблице со стороны других пользователей.
    AutoCalcFields Определяет способ вычислений с использованием полей
    Bof, Eof Bof - показывает, находится ли курсор таблицы перед первой записью, Eof - показывает, находится ли курсор таблицы после последней записи. Эти свойства принимают значение true только тогда, когда курсор выходит за пределы строк таблицы при вызове методов Prior() или Next(). При открытии таблицы свойство Bof также устанавливается в true автоматически.
    CachedUpdates Определяет, будут ли кэшироваться обновленные данные
    DatabaseName Определяет псевдоним BDE, используемый для соединения с базой данных.
    Exclusive Определяет, могут ли другие пользователи обращаться к данной таблице
    FieldCount Возвращает количество полей в таблице
    FieldDefs Содержит редактируемый список используемых в приложении полей таблицы
    Fields Возвращает указанное по индексу поле со всеми характеристиками
    Filter Определяет выражение, используемое для фильтрации записей
    Filtered Определяет, какой способ фильтрации используется: указанный в Filter или OnFilterRecord
    FilterOptions Управляет работой фильтров
    IndexDefs Выдает информацию об индексах базы
    IndexFieldCount Возвращает число полей в текущем индексном ключе
    IndexFieldNames Указывает поля, используемые в качестве индексного ключа
    IndexName Указывает имя используемого индекса
    IndexFields Возвращает указанное по индексу массива поле индексного файла со всеми характеристиками
    KeyExclusive Инвертирует действие функций поиска и установки диапазона
    KeyFieldCount Указывает количество ключевых полей, используемых для поиска
    MasterFields Указывает главные поля в отношении "главный/подчиненный
    MasterSource Указывает главный источник в отношении "главный/подчиненный"
    Modified Показывает, была ли данная запись изменена с момента последнего обновления базы методами Post или Cancel
    ReadOnly Устанавливает режим только чтения данных из источника
    RecordCount Возвращает количество записей в источнике данных
    SessionName Указывает, какой компонент используется для соединения с базой данных
    State Возвращает состояние источника данных
    TableName Указывает физическое имя файла сопоставленной таблицы
    TableType Указывает тип локальной таблицы
    UpdateMode Определяет тип SQL, используемый для изменения данных
    UpdateObject Определяет компонент UpdateSQL для использования совместно с кэшируемыми изменениями

    Основные методы компонента Table

    Основные методы компонента Table
    Метод Описание
    AddIndex() Создает новый индекс
    Append() Добавляет пустую строку к источнику данных, и переводит его в режим редактирования
    AppendRecord() Добавляет строку, используя указанные значения
    ApplyRange() Активизирует диапазон, установленный методами Set() или EditRange()
    ApplyUpdates() Сохраняет кэшированные изменения в базе данных
    BatchMove() Копирует группу строк из одного источника в другой
    Cancel() Отменяет ожидаемое изменение текущей строки
    CancelRange() Отменяет установки, сделанные методами Set() или EditRange()
    CancelUpdates() Отменяет ждущие изменения, занесенные в кэш
    ClearFields() Устанавливает для полей текущей строки значения по умолчанию
    Close() Закрывает источник данных
    CommitUpdates() Уведомляет кэш о сохранении изменений
    CreateTable() Создает новую таблицу
    Delete() Удаляет в таблице текущую запись
    DeleteIndex() Удаляет вторичный индекс
    DeleteTable() Удаляет соответствующую физическую таблицу в базе данных
    Edit() Переводит источник данных в режим редактирования
    EditKey() Позволяет изменять значения ключа поиска
    EditRangeEnd() Позволяет изменять верхний ключевой предел диапазона
    EditRangeStart() Позволяет изменять нижний ключевой предел диапазона
    EmptyTable() Удаляет все строки в источнике данных, оставляя только заголовок
    EnableControls() Разрешает использование интерфейсных компонентов визуализации и управления
    FetchAll() Считывает все ожидающие своей очереди строки базы данных
    FieldByName() Возвращает объект типа TField, используя имя поля в базе данных
    FindFirst() Осуществляет поиск первой записи по условию фильтрации
    FindNext() Осуществляет поиск следующей записи, соответствующей заданному критерию.
    FindKey() Выполняет точный поиск в источнике данных
    FindNearest() Выполняет приближенный поиск с частичным совпадением в источнике данных
    GetFieldNames() Возвращает список полей в источнике данных
    GetIndexNames() Возвращает список открытых индексов
    GotoKey() Выполняет точный поиск в источнике данных по ключу
    GoteNearest() Выполняет приближенный поиск в источнике данных по ключу
    Insert() Вставляет пустую строку перед текущей и позволяет ее редактировать
    InsertRecord() Вставляет строку, используя заданные значения столбцов
    Locate() Осуществляет поиск записи последовательным перебором
    LockTable() Блокирует локальную таблицу для монопольного использования
    Lookup() Осуществляет поиск записи в источнике и возвращает значения ее полей
    MoveBy() Перемещает логический курсор источника данных на заданное количество записей
    Open() Открывает источник данных
    Post() Сохраняет ждущие изменения текущей строки, очищая кэш
    RenameTable() Переименовывает локальную таблицу
    RevertRecord() Отменяет кэшированные изменения текущей строки
    SetKey() Переводит источник данных в режим поиска по ключу
    SetRange() Переводит источник данных в режим поиска по диапазону
    SetRangeEnd() Устанавливает верхний предел диапазона
    SetRangeStart() Устанавливает нижний предел диапазона
    UnlockTable() Разблокирует локальную таблицу от монопольного использования

    Основные события компонента Table

    Основные события компонента Table
    Событие Условие возникновения
    AfterCancel После вызова Cancel
    AfterClose После закрытия источника данных
    AfterDelete После вызова Delete
    AfterEdit После вызова Edit
    AfterInsert После вызова Insert
    AfterOpen После открытия источника данных
    AfterPost После вызова Post
    BeforeCancel Перед выполнением Cancel
    BeforeClose Перед закрытием источника данных
    BeforeDelete Перед выполнением Delete
    BeforeEdit Перед выполнением Edit
    BeforeInsert Перед выполнением Insert и Append
    BeforeOpen Перед открытием источника данных
    BeforePost Перед выполнением Post
    OnCalcField При необходимости ввода значений в вычисляемые поля
    OnDeleteError При ошибке удаления записи
    OnEditError При ошибке редактирования записи
    OnFilterRecord В режиме фильтрации, когда источник данных требует строку
    OnNewRecord При добавлении новой записи в источник данных
    OnPostRecord При ошибке сохранения записи
    OnUpdateError При ошибке во время сохранения кэшированных изменений
    OnUpdateRecord При сохранении каждой строки с помощью ApplyUpdates

    Создание заготовки приложения

    Создадим приложение, в котором реализуем управление созданными ранее таблицами, входящими в состав базы данных.

  • Создайте новый проект и сразу сохраните его в своем каталоге выполнения лабораторной работы. Для этого имя файла user1.cpp измените на uAppBDE, а имя проекта Project1.bpr измените на AppBDE. Это имя в дальнейшем будет иметь исполнимый файл проекта приложения
  • Поместите на новую форму следующие компоненты
    Компонент Вкладка палитры компонентов
    MainMenu Standard
    Table BDE
    DataSource Data Access
    DBGrid Data Controls
  • Настройте свойства компонентов, как приведено в таблице
    Таблица свойств главной формы приложения AppBDE
    Элемент управления Свойство Значение
    Главная форма Name MainForm
    Caption Приложение управления базой данных
    Width 555
    Height 375
    -----------------------------------------------------------------------------------------------------
    MainMenu Name MainMenu
    TMenuItem Name File
    Caption Файл
    -----------------------------------------------------------------------------------------------------
    Table Name School
    DatabaseName DBSchool
    TableName SCHOOL.DBF
    Active true
    -----------------------------------------------------------------------------------------------------
    DataSource Name School DataSource1
    DataSet
    -----------------------------------------------------------------------------------------------------
    DBGrid Name DBGrid1
    DataSource DataSource1
    Align alClient
  • Отредактируйте заголовки полей таблицы. Для этого через контекстное меню компонента
  • Редактор полей заполнится списком полей таблицы. Выделяя последовательно каждое поле в редакторе полей, измените свойство Заголовки полей в представлении таблицы SCHOOL Field DisplayLabel
  • Вернуться к учебному плану