Автор работы: Пользователь скрыл имя, 26 Января 2013 в 14:13, лекция
Программирование баз данных - очень большой и серьезный раздел самого что ни на есть практического программирования. На предыдущем курсе "Введение в программирование на Delphi" мы лишь коснулись этой темы, затронули даже не верхушку айсберга под названием Базы Данных, а только его макушку. Между тем, многие программисты большую часть своего времени тратят именно на проектирование баз данных и разработку приложений, работающих с ними. Это неудивительно - в настоящее время каждая государственная организация, каждая фирма или крупная корпорация имеют рабочие места с к
Такая
блокировка достигается методом LockTable(
Свойство LockType набора данных ADO имеет тип TADOLockType:
type TADOLockType = (ltUnspecified, ltReadOnly, ltPessimistic, ltOptimistic, ltBatchOptimistic);
Это свойство позволяет определить тип блокировки при открытии набора данных. Как видно из описания типа, свойство может иметь следующие значения:
ltUnspecified - тип блокировки не определен.
ltReadOnly - блокировка записи, читать данные можно.
ltPessimistic - пессимистическая блокировка. Свойство указывает, что если вы редактируете запись, то другие пользователи не смогут редактировать ее, пока вы не сохраните изменения.
ltOptimistic - оптимистическая блокировка. Блокировка подразумевает, что возникновение конфликта маловероятно. В связи с этим любой пользователь в любое время может редактировать любую запись. Проверка на наличие конфликтов производится только в момент сохранения изменений.
ltBatchOptimistic - свойство устанавливает блокировку на пакет записей, а не на отдельную запись. При этом все обновления, сделанные пользователем, не записываются сразу, а накапливаются в оперативной памяти. Позже они сохраняются одним пакетом. Такой подход увеличивает производительность приложения, но также увеличивается риск возникновения конфликтов.
Наборы данных ADO имеют два специфичных свойства, неразрывно связанные друг с другом: CursorLocation и CursorType. Курсоры оказывают большое влияние на то, каким образом извлекаются данные из таблиц, каким образом вы можете перемещаться по ним и т.д. Фактически, курсор - это механизм перемещения по записям набора данных. От того, какой курсор используется в многопользовательской среде, зависит способ перемещения по записям: только вперед или в обе стороны. Будете ли вы видеть изменения, сделанные другими пользователями, также зависит от типа применяемого курсора.
Это свойство определяет, каким образом извлекаются и модифицируются данные. Значений только два:
clUseClient - курсор на стороне клиента.
clUseServer - курсор на стороне сервера.
Клиентский курсор обслуживается механизмом ADO Cursor Engine. В момент открытия набора данных все данные перекачиваются с сервера на клиентский компьютер. После этого данные хранятся в оперативной памяти. Перемещения по данным и их модификация происходит значительно быстрее, кроме того, клиентский курсор обладает более широкими возможностями.
Серверный курсор обслуживается операционной системой. Благодаря тому, что курсор находится на стороне сервера, приложению нет смысла перекачивать все данные разом, это повышает скорость работы с БД. Серверные курсоры больше подходят для обслуживания больших наборов данных. Следует заметить, что если вы работаете с локальной базой данных (например, Access), то серверный курсор будет обслуживаться программой, обслуживающей эту базу данных.
Имеется пять типов курсора:
5.
Лекция: Таблицы Paradox в ADO: версия для печати
и PDA
На этой лекции вы создадите небольшое
приложение с двумя таблицами Paradox. Это
приложение нам понадобится в дальнейшем,
для изучения свойств полей. В приложении
для доступа к этим таблицам используем
механизм ADO, для чего нам потребуется
создать и настроить поставщика данных
ODBC. Для таблиц будет использоваться связь
один-ко-многим для создания подстановочного
lookup поля.
Изучение свойств полей лучше сразу проводить на примере. Для этого создадим небольшую демонстрационную базу данных, всего из двух таблиц, и приложение, работающее с ней. Попутно затронем темы, которых раньше не касались. Цель проекта: создать мини-меню для столовой, кафе или ресторана.
Прежде всего, определимся с таблицами. Таблицы будем создавать в формате 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 (типы) довольно распространенное в языках программирования и может вызвать конфликт названий. Попробуйте, если не верите!