Программирование баз данных в Delphi

Автор работы: Пользователь скрыл имя, 26 Января 2013 в 14:13, лекция

Краткое описание

Программирование баз данных - очень большой и серьезный раздел самого что ни на есть практического программирования. На предыдущем курсе "Введение в программирование на Delphi" мы лишь коснулись этой темы, затронули даже не верхушку айсберга под названием Базы Данных, а только его макушку. Между тем, многие программисты большую часть своего времени тратят именно на проектирование баз данных и разработку приложений, работающих с ними. Это неудивительно - в настоящее время каждая государственная организация, каждая фирма или крупная корпорация имеют рабочие места с к

Вложенные файлы: 1 файл

Программирование баз данных в делфи.doc

— 2.17 Мб (Скачать файл)

Такая блокировка достигается методом LockTable(). При этом значение свойства LockType этого набора данных определяет вид запрета. Значение ltReadLock запрещает чтение, а ltWriteLock - запись в набор данных. Можно запретить и чтение, и запись, но для этого следует вызвать метод LockTable() дважды. Блокировка таблиц методом LockTable() справедлива для таблиц Paradox или dBase, если вы используете механизм BDE. Когда изменения внесены, и необходимость блокировки пропадает, можно снять блокировку методом UnlockTable(), указав в параметре тип снимаемого запрета (ltWriteLock, ltReadLock).

Свойство LockType набора данных ADO имеет тип TADOLockType:

type TADOLockType = (ltUnspecified, ltReadOnly, ltPessimistic, ltOptimistic, ltBatchOptimistic);

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

ltUnspecified - тип блокировки не определен.

ltReadOnly - блокировка записи, читать данные можно.

ltPessimistic - пессимистическая блокировка. Свойство указывает, что если вы редактируете запись, то другие пользователи не смогут редактировать ее, пока вы не сохраните изменения.

ltOptimistic - оптимистическая блокировка. Блокировка подразумевает, что возникновение конфликта маловероятно. В связи с этим любой пользователь в любое время может редактировать любую запись. Проверка на наличие конфликтов производится только в момент сохранения изменений.

ltBatchOptimistic - свойство устанавливает блокировку на пакет записей, а не на отдельную запись. При этом все обновления, сделанные пользователем, не записываются сразу, а накапливаются в оперативной памяти. Позже они сохраняются одним пакетом. Такой подход увеличивает производительность приложения, но также увеличивается риск возникновения конфликтов.

Курсоры в наборах данных ADO

Наборы данных ADO имеют два специфичных свойства, неразрывно связанные друг с другом: CursorLocation и CursorType. Курсоры оказывают большое влияние на то, каким образом извлекаются данные из таблиц, каким образом вы можете перемещаться по ним и т.д. Фактически, курсор - это механизм перемещения по записям набора данных. От того, какой курсор используется в многопользовательской среде, зависит способ перемещения по записям: только вперед или в обе стороны. Будете ли вы видеть изменения, сделанные другими пользователями, также зависит от типа применяемого курсора.

CursorLocation (положение курсора)

Это свойство определяет, каким образом извлекаются и модифицируются данные. Значений только два:

clUseClient - курсор на стороне клиента.

clUseServer - курсор на стороне сервера.

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

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

CursorType (тип курсора)

Имеется пять типов курсора:

  • Unspecified - не указанный. В Delphi такой тип не используется, он присутствует только потому, что имеется в ADO.
  • Forward-only (только вперед). Этот тип курсоров обеспечивает самую высокую производительность, однако он позволяет перемещаться по записям только в одном направлении - от начала к концу, что делает его малопригодным для создания пользовательского интерфейса. Однако он хорошо подходит для программных операций, таких как перебор записей, формирование отчета и т.п.
  • Static (статический) - пользователь имеет возможность перемещаться в обоих направлениях, однако изменения записей, выполненные другими пользователями, не видны таким курсором.
  • Keyset (набор ключей). При открытии набора данных с сервера читается полный список всех ключей. Этот набор ключей хранится на стороне клиента. Если приложение нуждается в данных, провайдер OLE DB читает строки таблицы. Однако после открытия набора данных в этот набор нельзя добавлять новые ключи, или удалять имеющиеся. То есть, если другой пользователь добавил новую запись, текущий клиент ее не увидит. Однако он увидит изменения существующих записей, сделанные другими пользователями.
  • Dynamic (динамический). Самый мощный тип курсора, но при этом и самый ресурсоемкий. Он позволяет видеть все изменения, все добавления или удаления, сделанные другими пользователями, но при этом больше других замедляет работу с БД.

 

5. Лекция: Таблицы Paradox в ADO: версия для печати и PDA  
На этой лекции вы создадите небольшое приложение с двумя таблицами Paradox. Это приложение нам понадобится в дальнейшем, для изучения свойств полей. В приложении для доступа к этим таблицам используем механизм ADO, для чего нам потребуется создать и настроить поставщика данных ODBC. Для таблиц будет использоваться связь один-ко-многим для создания подстановочного lookup поля.

Подключение таблиц Paradox 7 к приложению через ADO

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

Прежде всего, определимся с  таблицами. Таблицы будем создавать  в формате Paradox 7, описание типов полей которого подробно рассматривалось на лекции №30 курса "Введение в программирование на Delphi". Для доступа к данным этих таблиц используем механизм ADO. Создавать таблицы удобней с помощью утилиты Database Desktop, входящей в состав Delphi.

Пусть главная таблица называется Food, ее поля описаны в таблице 5.1:

Таблица 5.1. Поля таблицы Food

Имя поля:

Тип

Описание 

FKey

Auto increment (+)

Ключевое поле, служит счетчиком блюд.

FName

Alpha (A)

Текстовое поле размером 30, название блюда.

FType

Long Integer (I)

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

FVeget

Logical (L)

Логическое  поле - вегетарианская еда, или нет. Потребуется для изучения свойств  логических полей.

FCena

Money ($)

Поле денежного  типа. Стоимость блюда.


Подчиненная таблица будет еще  проще:

Таблица 5.2. Поля таблицы Tips

Имя поля:

Тип

Описание

TKey

Auto increment (+)

Ключевое поле, служит счетчиком типов.

TName

Alpha (A)

Текстовое поле размером 20, название типов.


Итак, начнем. Откройте утилиту Database Desktop. Чтобы облегчить работу и не искать каждый раз нужный каталог, укажем сразу рабочую папку, которую нужно вначале создать средствами Windows:

C:\Menu

Для этого выберите команду меню "File -> Working Directory". В открывшемся окне нажмите кнопку "Browse" и найдите эту директорию на диске. Когда вы выберите ее, нажмите кнопку "OK". Теперь эта папка стала папкой "по умолчанию". При попытке открыть или создать таблицу в утилите Database Desktop, эта папка всегда будет текущей (если в дальнейшем вы не смените рабочую папку).

Далее выбираем команду "File -> New -> Table". Оставьте тип Paradox 7, нажмите "ОК".

Далее вам предлагается ввести названия и  типы полей. Сделайте это, как в таблице 5.1.

Как только вы ввели названия, типы и размеры (размер есть только у текстового поля), в списке "Table properties" выберите команду "Table Language" и нажмите кнопку "Modify". В выпадающем списке выберите язык, как на рисунке 5.1:

 
Рис. 5.1.  Выбор языкового драйвера для таблицы Paradox

Если этого не сделать, у вас  будут проблемы с отображением русских символов.

Далее нажмите кнопку "Save as" и укажите имя таблицы: Food. Таким же образом сделайте таблицу Tips, руководствуясь таблицей 5.2.

После этого вы можете закрыть утилиту Database Desktop, она больше не нужна.

Пойдем дальше. Поскольку мы собираемся подключаться к таблицам Paradox с помощью механизма доступа к данным ADO, нам потребуется установить на компьютере нужный драйвер ODBC. Для этого откройте Панель управления (Пуск -> Настройка -> Панель управления). Если вы используете Windows 2000, XP или более новую, вам придется еще выбрать команду "Администрирование". Далее открываем " Источники данных ODBC". Нажимаем кнопку "Добавить", выбираем драйвер " Microsoft Paradox Driver (*.db) " и нажимаем кнопку "Готово". Далее в поле "Имя источника данных" укажите MenuParadox, этот источник мы будем использовать только для этой нашей программы. Затем уберите галочку "Использовать текущий каталог" и нажмите кнопку "Выбор каталога". В открывшемся окне выберите нашу папку C:\Menu:

 
Рис. 5.2.  Установка драйвера ODBC

Нажимаете "ОК", и драйвер готов. Теперь можете закрыть все остальные окна, они больше не нужны.

Загружаете Delphi. Свойству Name главной формы присвойте имя fMain, сохраните модуль формы как Main, а проект в целом как MyMenu. В свойстве Caption формы напишите "Изучение свойств полей". На форму бросьте компонент Panel с вкладки Standard, свойство Align установите в alTop. Ниже с вкладки Data Controls установите компонент DBGrid, в свойстве Align которого выберите alClient, чтобы заполнить оставшееся пространство. Затем на панель установите простую кнопку, в свойстве Caption которой напишите "Типы блюд". У вас должна получиться такая форма:

 
Рис. 5.3.  Главная форма проекта

Раз у нас еще будет форма с типами блюд, следовательно, понадобится и модуль данных, общий для всех форм. Выберите команду File -> New -> Data Module. В свойстве Name модуля укажите fDM и сохраните модуль под именем DM.

Теперь  с вкладки ADO устанавливаем компонент ADOConnection. Сразу свойство Name для краткости обращения переименуйте в Con1. Займемся подключением. Дважды щелкните по компоненту, чтобы открыть редактор подключений. Нажмите кнопку "Build". На вкладке "Поставщик данных" по умолчанию должен быть "Microsoft OLE DB Provider for ODBC Drivers". Нам нужен именно этот поставщик. Переходим на вкладку "Подключение" (для этого можете просто нажать кнопку "Далее"). В выпадающем списке "Использовать имя источника данных" нам нужно выбрать MenuParadox, то подключение, которое мы создали ранее. К слову сказать, мы могли и не указывать адрес данных, могли оставить галочку "Использовать текущий каталог". В этом случае таблицы нужно было бы расположить там же, где и программа, или создавать подключение при работающей программе. Так удобно делать при использовании локальной базы данных. Способ, которым мы воспользовались сейчас, более удобен для многопользовательских файл-серверных БД. Если бы базы лежали где-то на сетевом диске, тогда мы могли бы в качестве папки указать сетевой путь, например:

\\myserver\Menu

но тогда эта папка должна быть открыта в сети как общий  ресурс.

Нажмите кнопку "Проверить подключение". Если вышло сообщение "Проверка подключения  выполнена", значит, вы все сделали  правильно, и ошибок нет.

Нажимаем  кнопку "ОК", чтобы подтвердить подключение, и еще раз "ОК", чтобы закрыть окно подключений. Сразу же свойство LoginPrompt компонента Con1 переводим в False, чтобы каждый раз при подключении программа не запрашивала имя пользователя и пароль. Затем в свойстве Connected устанавливаем True. Подключение произошло.

Далее с вкладки ADO устанавливаем два компонента ADOTable. Выделите оба компонента, и в их свойстве Connection выберите наш Con1. Займемся вначале первой таблицей. В свойстве TableName выберите таблицу Food, свойство Name переименуйте в FoodT, а свойство Active переведите в True. Для второго компонента ADOTable выберите таблицу Tips, а компонент переименуйте в TipsT. Также переведите Active в True. Далее рядом с таблицами установите два компонента DataSource с вкладки Data Access. Первый переименуйте в FoodDS, второй - в TipsDS. В свойстве DataSet каждого выберите соответствующую таблицу. Не забудьте сохранить проект.

Перейдите на главную форму. Командой File -> Use unit подключитесь к созданному модулю данных. В свойстве DataSource сетки DBGrid выберите fDM.FoodDS. На сетке должны появиться столбцы с данными. Нажмите кнопку Run на панели инструментов или горячую клавишу F9. Проект компилируется, запускается, и… выходит ошибка:

 
Рис. 5.4.  Ошибка при компиляции

В чем дело? Вроде бы, мы все делали правильно, иначе на сетке DBGrid не появились бы нужные столбцы? Просто мы добрались до проблем с полями. Нажмите кнопку "ОК", затем выберите Run -> Program reset, чтобы закрыть повисшую программу. Теперь перейдите на окно модуля данных, щелкните дважды по компоненту FoodT, чтобы вызвать редактор полей. Затем щелкните по окну редактора правой кнопкой и выберите команду Add all fields (Добавить все поля). То же проделайте и со второй таблицей. Снова сохраните проект, скомпилируйте его и запустите - теперь полный порядок, программа запускается и выполняется нормально.

Дело в том, что, используя драйверы ODBC с "неродными" форматами баз данных, такими как dBase или Paradox, приходится точно указывать, какие у нас поля, а не надеяться на авто-определение. Вообще, создавать поля для каждого набора данных считается хорошим тоном в программировании.

Далее создадим еще одну форму, для  редактирования типов блюд:

 
Рис. 5.5.  Форма редактора типов блюд

Форму назовите fMyTypes, сохраните модуль как MyTypes. Чтобы убрать из окна лишние кнопки системной строки и не позволять пользователю менять размеры окна, в свойстве BorderStyle формы выберите значение bsDialog. Не забудьте подключить к нему модуль данных DM. На форме две простых кнопки, поле DBEdit с вкладки Data Controls и сетка DBGrid с этой же вкладки. В свойстве DataSource и сетки, и поля выберите fDM.TipsDS. У поля DBEdit, кроме того, в свойстве DataField выберите поле TName. Обратите внимание, что я назвал форму и модуль как MyTypes, а не просто как Types. Слово Types (типы) довольно распространенное в языках программирования и может вызвать конфликт названий. Попробуйте, если не верите!

Информация о работе Программирование баз данных в Delphi