понедельник, 28 июля 2008 г.

Инструменты от Borland. Инструменты для работы с базами данных, поставляемые вместе с Delphi.

Для работы с базами данных нам понадобятся инструменты. Во-первых, это сам Delphi. ;) Во-вторых это Database Desktop, с помощью которого можно создать таблицу и задать ее свойства. В-третьих это SQL Explorer, который позволяет просматривать данные в таблицах, как подряд, так и выборочно. В третьих это SQL Monitor, позволяющий рассмотреть в деталях, как выполняются наши запросы к ODBC. ODBC мы будем использовать при подключении в MS SQL Server'у, тогда и воспользуемся им. И, наконец, BDE Administrator и DataPump, которыми мы будем пользоваться довольно-таки редко, но знать о них необходимо.

Database Desktop

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

Для того чтобы создать таблицу следует выбрать пункт File ->New -> Table. При этом вас спросят, какого типа таблицу вы собираетесь создавать (Paradox 7). Нажмите OK, и приступим к собственно созданию таблицы. Первыми у нас будут идти поля, составляющие первичный ключ. Эти поля всегда располагаются в начале таблицы. Чтобы указать, что поле входит в первичный ключ надо в свойстве Key этого поля поставить <*>. Это можно сделать нажатием пробела, когда курсор установлен в этот столбце, или правой кнопки мыши. Рекомендую для первичного ключа создавать специальное поле типа Autoincrement - так называемый <суррогатный ключ>. Преимуществ у этого подхода несколько. Возможно, конечно, создание таблицы вообще без ключей и индексов, но в дальнейшем они нам пригодятся, так что следует все-таки их (ключевые поля) создать.

Итак, первым вводим ключевое поле. Можем назвать его KeyField, или по другому, кому как нравится. Тип ему поставим "+", т.е. Autoincrement. Чтобы указать тип поля можно нажать пробел. Выпадет список всех возможных значений типа. У каждого есть горячая клавиша. В дальнейшем удобнее пользоваться именно ими.

Для поля этого типа длина не задается, поэтому при нажатии Tab мы перескакиваем сразу в колонку Key. Нажмем в ней пробел, указав, таким образом, что это поле входит в первичный ключ.

Следующим полем пусть у нас будет символьное. В колонке Type будет отображено <A> (от &ltAlpha>), а не <S> (от &ltString>), как можно было бы подумать. &ltS> означает &ltShort>, т.е. короткое целое, не путайтесь. Для символьного поля уже следует задать длину в колонке Size. Строк переменной длины не предусмотрено, поэтому следует сразу указать необходимое число символов. В дальнейшем увеличение длины поля может вызвать неудобства в виде перекомпиляции проекта (это зависит от способа обращения к полям). Это связано с тем, что Delphi изменение длины символьного поля рассматривает как изменение типа. Посмотрите на рисунок, здесь показана как раз эта стадия создания таблицы.

Вообще, названия типов говорят сами за себя, подробнее рассматривать, наверное, смысла нет. Добавлю только, из собственного опыта, что пользоваться полем типа <Money> неудобно. Оно требует к значению, которое вы собираетесь записать в такое поле, приписывать знак денежной единицы, причем такой, как определен в региональных настройках Windows.

После того, как мы создали структуру таблицы, самое время указать свойства языка. Для этого в справа вверху в выпадающем списке выбираем <Table language>. Нажмем <Modify>. Укажем значение Pdox ANSI Cyrillic. Это позволит нам правильно видеть и сортировать русскоязычные текстовые поля в таблице.

Создать вторичные индексы можно, выбрав в выпадающем списке, справа вверху пункт <Secondary Indexes> Они пригодятся нам при поиске и сортировке. Однако не стоит ими чрезмерно увлекаться: каждая операция записи данных в таблицу влечет за собой изменение индексов, при слишком большом их количестве и большой таблице это может заметно замедлить работу.

Среди других возможностей отметим защиту паролем ("Password security"), подстановку значений из зависимых таблиц, ("Table Lookup"), просмотр списка зависимых таблиц ("Dependent tables") и контроль ссылочной целостности ("Referential Integrity"). О последнем пункте подробнее. Когда у вас есть главная и подчиненная таблицы возможна ситуация, когда при удалении записей из одной таблицы, другая окажется без связанных значений. Контроль ссылочной целостности позволяет отследить такую ситуацию и запретить удаление. Подробнее об этом здесь.

Еще одна возможность Database Desktop - конструирование таблицы не только вышеописанным способом, но и с помощью SQL запросов, выбрав в меню File ->New -> SQL File. Подробнее о создании таблиц с помощью SQL запросов см. соответствующий урок.

Database Desktop для нас полезен также своим меню "Tools". Здесь можно создать псевдоним "Alias Manager:" (см. BDE Administrator), скопировать содержимое одной таблицы в другую "Utilities->Copy", очистить содержимое таблицы "Utilities->Empty table", просмотреть ее структуру "Utilities->Info structure" и другие возможности.

Примечательна возможность выборки данных в Database Desktop - QBE или Query by example - запрос на базе примера. Мастер позволит вам выбрать таблицу, на базе которой создается запрос, поля, значения которых должны попасть в результирующую таблицу, при необходимости объединить несколько таблиц, и все это просто щелкая мышкой. Однако если мы хотим считать себя профессионалами, знание SQL необходимо. QBE нам в этом поможет - то что мы нащелкали мышкой преобразуются в команды SQL, которые мы можем просмотреть нажав кнопку "Show SQL" на панели инструментов. Но для выборки данных мы чаще будем использовать


SQL Explorer

SQL Explorer. Это наиболее универсальный и часто используемый инструмент при работе с базами данных. С его помощью можно не только создавать псевдонимы БД, но и просматривать и, при необходимости, редактировать их содержимое. В окне SQL Explorer расположены главное меню, инструментальная панель и два рабочих поля -левое в закладками Database и Dictionary и правое с закладками Definition, Data и Enter SQL. Главное меню и инструментальная панель служат для управления утилитой и ее настройки. Левое поле в режиме отображения Database позволяет просматривать уже созданные псевдонимы и создавать новые, редактировать и уничтожать их. Здесь же можно просмотреть структуру БД, связанной с конкретным псевдонимом: входящие в нее таблицы, домены, представления, хранимые процедуры и т.д. В режиме отображения Dictionary левое поле открывает доступ к словарям БД. Закладки правого поля меняются в зависимости от того, какой компонент выбран в левом поле. В режиме Definition оно отображает определение или параметры выбранного компонента (таблицы, поля, хранимой процедуры и т.п.). В режиме Data можно увидеть содержимое таблицы, выбранной в левом окне. Режим Enter SQL предназначен для ввода SQL-операторов, их выполнения и отображения результатов выполнения. Рассмотрим некоторые, важные для нас, пункты меню SQL Explorer:
Dictionary - обслуживает словари, т.е. хранилища информации о базах данных и существующих в них объектах (таблицах, ограничениях, ссылочных целостностях и т.п.):

  • Select - открывает диалоговое окно Select a Dictionary для выбора одного из доступных словарей. Выбранный словарь становится активным словарем, доступ к объектам которого открывает левое поле в режиме Dictionary.
  • Register - заносит текущий словарь в список доступных словарей окна Select a Dictionary.
  • Unregister - удаляет регистрацию текущего словаря из списка Select a Dictionary.
  • New - создает новый словарь.
  • Delete - уничтожает текущий словарь.
  • Import From Database - импортирует в текущий словарь сведения об объекте.
  • Import From File - добавляет в текущий словарь сведения из файла, созданного опцией Export To File. Опция полезна для переноса словарей на машину другого разработчика.
  • Export To File - записывает в файл данные из текущего словаря.

Options определяют некоторые параметры утилиты:

  • Query - задает ограничители строк, предложений, комментариев в тексте запроса, а также определяет, будет ли возвращаемый НД изменяемый.
  • Transaction Isolation - устанавливает уровень разграничения транзакций.
  • Word Wrap - если отмечена, редактор ввода переносит текст запроса на новую строку, если очередное слово не умещается в рамке окна.
  • Show Confirmations - определяет, будет ли появляться диалоговое окно для подтверждения вносимых изменений.
  • Show Warnings - указывает, будет ли появляться диалоговое окно с предупреждением о возможной потере данных. Данные могут быть потеряны, например, при перемещении столбца на новое место, так как в этом случае запрос должен быть повторен с указанием нового порядка следования полей.
  • Sync Pages - переносит схемную информацию из выбранной БД в выбранный словарь при переключении с закладки Database на закладку Dictionary. Перед переносом появится диалоговое окно для подтверждения операции

С помощью SQL Explorer можно создавать новые псевдонимы БД ("Object->New"), изменять их параметры и уничтожать. Однако в отличие от BDE Administrator, утилита SQL Explorer не может изменить свойства всех однотипных псевдонимов или сделать общесистемные установки форматов.

Если раскрыть дерево метаданных для какой-нибудь базы данных, то можно увидеть все или некоторые (зависит от типа БД) из таких узлов:

  • Domains - домены;
  • Tables - таблицы;
  • Views - виртуальные таблицы (представления);
  • Procedures - хранимые процедуры;
  • Functions - функции, определенные пользователем;
  • Generators - генераторы;
  • Exceptions - исключения;
  • Blob Filters - BLOB-фильтры.

В состав метаданных локальных БД входят только таблицы.

Открыв, например, дерево "таблицы", можно увидеть список таблиц, выбрать какую-нибудь можно щелкнув по ней мышкой. При этом в правом окне отобразится детальная информация об этой таблице, такая как: тип, язык, Версия, дата и время последней модификации, и др., в зависимости от типа таблицы. Перейдя на закладку "Data" можно увидеть содержимое этой таблицы, а на закладке "Enter SQL" ввести SQL-запрос и выполнить его. Этой возможностью мы будем часто пользоваться в дальнейшем.


BDE Administrator

BDE Administrator предназначен для создания псевдонимов баз данных и настройки их свойств. В начале урока я упомянул, сто пользоваться им нам придется редко. Это потому, что, обычно, им приходится пользоваться один-два раза за все время разработки проекта.

Создать псевдоним (Alias, в терминах Delphi) можно выбрав в меню Object пункт New. В появившемся окне выбрать тип базы данных - STANDARD для баз данных формата Paradox (.db) и dBase/FoxPro/Clipper (.dbf), INTRBASE для баз данных Interbase и т.д. Обратите внимание, что в этот список также включены все установленные в вашей системе драйвера ODBC. А так же на то, что если у вас уже есть настроенные ODBC-соединения, то они так же будут отображены в списке псевдонимов. Т.е. налицо полная поддержка ODBC через DBE. О том, что нам это дает, мы поговорим позже.

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

Заметим еще, что создать псевдоним можно не только с помощью BDE Administrator'а, но и с помощью Database Desktop'а и SQL Explorer'а.

В левом окне на закладке Configuration можно найти еще одно дерево с параметрами. На этот раз речь идет не о параметрах подключения, а о параметрах BDE.

В узле Drivers этого дерева настраиваются параметры драйверов баз данных, как встроенных в BDE (Native), так и заимствованных из ODBC.

Рассмотрим параметры драйвера Paradox, так как этих таблицах мы будем рассматривать однопользовательский подход к проектированию баз данных:

  • NET DIR - Местонахождение файла PDOXUSRS.NET. Для файл-серверной архитектуры необходимо, чтобы он указывал на сетевой, доступный всем пользователям, диск.
  • LangDriver - Название таблицы символов, определяющая набор символов, используемый в таблице и порядок их сортировки. Для русского языка следует установить Pdox ANSI Cyrillic
  • Level - номер версии Paradox, в формате которого BDE создает временные таблицы. Ставим 7
  • Block Size - размер блока, выделяемого за раз при заполнении таблиц. Для Level =7 возможные значения будут 1024, 2048, 4096, 16384 и 32768. Оставим 2048, по умолчанию.
  • Fill Factor - на сколько процентов должна быть заполнена таблица данными, чтобы BDE выделил еще блок. Уменьшение этого параметра повысит быстродействие, но увеличит размеры индексом. Оставим 95, по умолчанию.
  • STRICTINTEGRTY - определяет, будет ли BDE следить за ссылочной целостностью. Оставим TRUE.

К MS SQL Server'у можно подключиться и через BDE, и через ODBC. Рассмотрим оба варианта
Некоторые параметры драйвера MSSQL

  • BATCH COUNT - количество записей, которое накапливает BDE перед сбросом на сервер. При явном завершении транзакции данные будут сброшены не дожидаясь накопления.
  • BLOB EDIT LOGGING - включает/выключает регистрацию изменений полей BLOB (Binary Large Object) в журнале транзакций SQL Server'a. Установка этого параметра в False выключит регистрацию и увеличит производительность, однако это потребует также изменения настройки SQL Server'a, в частности установки параметра BULKCOPY в ON. Оставим этот параметр пока в TRUE.
  • DATABASE NAME - имя базы данных на сервере, к которой мы собираемся подключаться.
  • CONNECT TIMEOUT - количество секунд, которое BDE ожидает ответа сервера. Если за это время соединение установить не удалось, выдается сообщение о невозможности связаться с сервером.
  • MAX QUERY TIME - время в секундах, в течении которого ожидается выполнение запроса. Если запрос выполняется дольше, то он считается зависшим и ожидание прекращается. Такая ситуация может возникнуть при плохой связи, перегрузке сервера, а как же из-за мертвых блокировок.
  • LANGDRIVER - Название таблицы символов, определяющая набор символов, используемый в таблице и порядок их сортировки. Для русского языка следует установить Pdox ANSI Cyrillic
  • OPEN MODE - режим открытия базы данных. Можно поставить в READ ONLY, лишив пользователя возможности что-либо изменить в данных. На самом деле этот способ подойдет только как экстренный и только против чайников.
  • SQLPASSTHRU MODE - пожалуй важнейший для технологии клиент-сервер режим, определяющий, каким образом происходит взаимодействие BDE с сервером. Passthrough SQL - операторы SQL, выполняемые при помощи компонента TQuery. Возможные значения:
    1. SHARED AUTOCOMMIT - Неявное создание и подтверждение транзакций, при выполнении любых операций с базами данных. Просто выполняется TDatabase.StartTransaction перед каждым обращением к серверу и TDatabase.Commit после. Passthrough SQL и команды BDE используют одно и то же соединение с сервером.
    2. SHARED NOAUTOCOMMIT - Неявные транзакции стартуют как и в предыдущем случае, но подтверждение необходимо производить самому. Passthrough SQL и команды BDE используют одно и то же соединение с сервером.
    3. NOT SHARED - Passthrough SQL и команды BDE не могут использовать одно и то же соединение с сервером. Обновляемые запросы не поддерживаются псевдонимами БД, для которых установлен этот режим.
  • SQLQRYMODE - режим выполнения запросов SQL. Возможные значения:
    1. NULL - для доступа к БД запросы сначала посылаются серверу, а затем, если сервер отказал в обработке, обрабатываются локально
    2. SERVER - только серверная обработка запросов
    3. LOCAL - только локальная обработка

Некоторые параметры драйвера SQL Server (ODBC)

  • BATCH COUNT - количество записей, которое накапливает BDE перед сбросом на сервер. При явном завершении транзакции данные будут сброшены не дожидаясь накопления.
  • DATABASE NAME - имя базы данных на сервере, к которой мы собираемся подключаться.
  • CONNECT TIMEOUT - количество секунд, которое BDE ожидает ответа сервера. Если за это время соединение установить не удалось, выдается сообщение о невозможности связаться с сервером.
  • MAX QUERY TIME - время в секундах, в течении которого ожидается выполнение запроса. Если запрос выполняется дольше, то он считается зависшим и ожидание прекращается. Такая ситуация может возникнуть при плохой связи, перегрузке сервера, а как же из-за мертвых блокировок.
  • LANGDRIVER - Название таблицы символов, определяющая набор символов, используемый в таблице и порядок их сортировки. Для русского языка следует установить Pdox ANSI Cyrillic
  • ODBC DSN - Название псевдонима ODBC, из которого был взят этот псевдоним BDE
  • OPEN MODE - режим открытия базы данных. Можно поставить в READ ONLY, лишив пользователя возможности что-либо изменить в данных. На самом деле этот способ подойдет только как экстренный и только против чайников.
  • SQLPASSTHRU MODE - пожалуй важнейший для технологии клиент-сервер режим, определяющий, каким образом происходит взаимодействие BDE с сервером. Passthrough SQL - операторы SQL, выполняемые при помощи компонента TQuery. Возможные значения:
    1. SHARED AUTOCOMMIT - Неявное создание и подтверждение транзакций, при выполнении любых операций с базами данных. Просто выполняется TDatabase.StartTransaction перед каждым обращением к серверу и TDatabase.Commit после. Passthrough SQL и команды BDE используют одно и то же соединение с сервером.
    2. SHARED NOAUTOCOMMIT - Неявные транзакции стартуют как и в предыдущем случае, но подтверждение необходимо производить самому. Passthrough SQL и команды BDE используют одно и то же соединение с сервером.
    3. NOT SHARED - Passthrough SQL и команды BDE не могут использовать одно и то же соединение с сервером.Обновляемые запросы не поддерживаются псевдонимами БД, для которых установлен этот режим.
  • SQLQRYMODE - режим выполнения запросов SQL. Возможные значения:
    1. NULL - для доступа к БД запросы сначала посылаются серверу, а затем, если сервер отказал в обработке, обрабатываются локально
    2. SERVER - только серверная обработка запросов
    3. LOCAL - только локальная обработка

Отметим, что большинство параметров менять нет никакой необходимости. Значения по умолчанию нас вполне устроят.

Последнее приложение, которое мы рассмотрим в рамках этого урока - DataPump. Этот инструмент пригодится для переноса большого количества данных из одного источника в другой. Он и переводится с английского как "насос данных". Например, проект перерос сам себя, понадобились возможности технологии "Клиент/сервер". Вы модернизируете ваш проект, а затем вам надо не потерять наработанные данные. Вот в этом случае вам и пригодится DataPump. Или в какой другой задаче переноса большого количества данных. Мастер проведет вас последовательно по всем шагам, расспросит о ваших пожеланиях, позволит вам выбрать место, откуда брать и куда помещать данные, какие создавать индексы и т.п. Интерфейс весьма прост и нагляден, так что не будем больше тратить на него время.

Комментариев нет: