Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Системная информация утилиты настройки BDE (BDECFG)





 

Итак, мы познакомились с наиболее важной возможностью утилиты настройки BDE - созданием и редактированием алиасов, определяющих параметры доступа к базам данных. Однако, утилита настройки BDE позволяет специфицировать не только алиасы, но и драйверы для доступа к базам данных, а также различную системную информацию, составляющую операционное окружение этих самых алиасов. Системная информация располагается на страничках “System”, “Date”, “Time”, “Number”. Рассмотрим подробней эти странички.

· System: Определяет память и технические установки для таблиц в формате Paradox. Установленные по умолчанию значения обеспечивают оптимальные параметры работы с таблицами Paradox. Однако, если у Вас возникают проблемы, Вы можете изменить минимальный и максимальный размер кэш-буфера (MINBUFSIZE, MAXBUFSIZE; значения по умолчанию соответственно 128 и 2048 Êá - должны быть меньше размера физической памяти, доступной для Windows), а также максимальную величину стандартной (low) памяти, используемой BDE для доступа к базе (LOW MEMORY USAGE LIMIT, значение по умолчанию - 32 Êá). Вы можете также специфицировать языковый драйвер по умолчанию (LANGDRIVER), однако языковый драйвер, установленный в алиасе, имеет больший приоритет. Аналогичным образом (и с теми же оговорками относительно приоритета) Вы можете изменить параметр SQLQRYMODE, если у Вас установлен Borland SQL Links. С помощью параметра LOCAL SHARE можно управлять возможностью одновременного доступа к таблицам из разных приложений через BDE и не через BDE (например, с использованием своей библиотеки доступа). Значение по умолчанию - false, что означает запрет такой работы. Параметр AUTO ODBC определяет режим выборки параметров алиасов, основанных на ODBC-драйверах. Установленное по умолчанию значение false означает, что параметры берутся из конфигурационного файла BDE (IDAPI.CFG). Если Вы желаете брать ODBC-алиасы из файла ODBC.INI, установите этот параметр в true. Стоит упомянуть и о параметре DEFAULT DRIVER, который используется всякий раз, когда в названии таблицы отсутствует расширение и таблица имеет формат локальных СУБД. Остальные параметры (VERSION и SYSFLAGS) являются системными, и их не следует изменять.

· Date: Определяет установки, используемые при конвертации строковых значений в дату и обратно. Основаны на значениях, устанавливаемых для каждой страны и зафиксированных в файле WIN.INI (секция [intl]). Однако, все параметры формата даты, времени и чисел BDE берет не из конфигурационного файла BDE, куда попадают данные установки, а из соответствующих переменных модуля SysUtils. По-видимому, эта ситуация произошла по недосмотру разработчиков. Поэтому мы перечислим параметры страничек “Date”, “Time”, “Number” и укажем те переменные, которыми действительно можно управлять изменением системной информации.

Среди параметров даты имеются следующие:

SEPARATOR - символ, используемый для разделения дня, месяца и года в дате. Ему соответствует переменная DateSeparator (Char*). Обычно имеет значения ‘.’, ‘-’, ‘/’. Значение по умолчанию берется из параметра sDate секции [intl] файла WIN.INI.

MODE - управляет порядком следования месяца, дня и года в дате и может иметь значения: 0 - для MDY (месяц-день-год), 1 - для DMY (день-месяц-год), или 2 - для YMD (год-месяц-день). Прямого соответствия переменным модуля SysUtils не имеет. Вместо него, а также вместо параметров FOURDIGITYEAR, YEARBIASED, LEADINGZEROM и LEADINGZEROD используются переменные ShortDateFormat (string[15]) и LongDateFormat (string[31]). В этих переменных могут применяться только символ-разделитель дат (DateSeparator) и символьные выражения типа ‘m’, ‘mm’, ‘d’, ‘dd’, ‘yy’ и ‘yyyy’, определяющие месяц, день и год. Например, формат “короткой” даты может выглядеть как “dd.MM.yy”, а формат “длинной” даты - как “d MMMM yyyy 'г.'”. Значения по умолчанию берутся из параметров sShortDate и sLongDate секции [intl] файла WIN.INI. Здесь уместно сделать небольшое замечание. При отображении даты и времени в качестве символа-разделителя можно использовать любой символ, в том числе и отличный от символа DateSeparator (или TimeSeparator). Однако при попытке вставить в таком формате дату или время BDE “выдаст” ошибку, связанную с неправильным форматом даты/времени. Поэтому для корректной вставки данных в таблицы необходимо, чтобы в переменной ShortDateFormat символ-разделитель совпадал с символом DateSeparator, а в переменной LongTimeFormat (и

Рис. 3: Программа DateTime демонстрирует работу с форматами даты и времени.

ShortTimeFormat) - с символом TimeSeparator. Для изучения работы с форматами даты и времени посмотрите программу DateTime, имеющуюся на вашем диске (рис. 3). Вы можете скопировать ее в свой директорий и поэскпериментировать с отображением и вводом данных.

· Time: Определяет установки, используемые при конвертации строковых значений во время и обратно, которые основаны на значениях, устанавливаемых для каждой страны и зафиксированных в файле WIN.INI (секция [intl]). Аналогично дате, для формата времени совместно с ShortDateFormat используются переменные LongTimeFormat (обращаем внимание - именно LongTimeFormat, а не ShortTimeFormat) и TimeSeparator. Значения по умолчанию вычисляются по параметрам iTime и iTLZero секции [intl] файла WIN.INI. Кроме указанных переменных, для форматирования можно использовать переменные TimeAMString (основана на параметре s1159 секции [intl]) и TimePMString (основана на параметре s2359 секции [intl]).

· Number: Описывает трактовку чисел BDE. В частности, определяет символ для десятичной точки (переменная DecimalSeparator, основана на параметре sDecimal секции [intl]), разделитель для тысяч (переменная ThousandSeparator, основана на параметре sThousand секции [intl]), количество знаков после запятой (переменная CurrencyDecimals, основана на параметре sCurrDigits секции [intl]) и наличие лидирующих нулей.

Как уже отмечалось выше, утилита настройки BDE сохраняет всю конфигурационную информацию в файле IDAPI.CFG. Этот файл с предустановленными ссылками на драйверы и некоторыми стандартными алиасами создается при установке Delphi. Кроме того, он создается при установке файлов редистрибуции BDE (т.е. когда Вы переносите BDE и SQL Links на другие компьютеры).

Рис. 4: Диалоговое окно “Add ODBC Driver” позволяет установить драйверы для Access, FoxPro и других баз данных.

Следующий шаг состоит в создании BDE-надстройки над ODBC-алиасом. Для этого Вам нужно убедиться, что в Вашем директории IDAPI имеется файл IDODBC01.DLL - в противном случае нужно заново установить BDE. После этого можно загрузить утилиту настройки BDE. Если Вы нажмете кнопку “New ODBC Driver” на страничке “Drivers”, Вы увидите диалоговое окно, изображенное на рис.4. Название BDE-драйвера, основанного на ODBC-алиасе, по умолчанию, должно начинаться с букв “ODBC_”. Поэтому такие буквы уже вынесены перед названием драйвера, так что Вам не нужно их вводить. Введите любое название драйвера и выберите из выпадающих списков сначала ODBC-драйвер, а затем - созданный Вами на его основе ODBC-алиас (Default Data Source Name).

Таким образом, мы создали BDE-драйвер, основанный на ODBC-алиасе. После этого BDE-алиас создается стандартным способом, который мы рассмотрели выше.

 

 

Утилита Database Desktop

 

Database Desktop - это утилита, во многом похожая на Paradox, которая поставляется вместе с Delphi для интерактивной работы с таблицами различных форматов локальных баз данных - Paradox и dBase, а также SQL-серверных баз данных InterBase, Oracle, Informix, Sybase (с использованием SQL Links). Исполняемый файл утилиты называется DBD.EXE, расположен он, как правило, в директории, называемом DBD (при установке по умолчанию). Для запуска Database Desktop просто дважды щелкните по ее иконке.

 

Рис. 5: Выпадающий список в диалоговом окне Table Type позволяет выбрать тип создаваемой таблицы.

После старта Database Desktop выберите команду меню File|New|Table для создания новой таблицы. Перед Вами появится диалоговое окно выбора типа таблицы, как показано на рис.5. Вы можете выбрать любой формат из предложенного, включая различные версии одного и того же формата.

После выбора типа таблицы Database Desktop представит Вам диалоговое окно, специфичное для каждого формата, в котором Вы сможете определить поля таблицы и их тип, как показано на рис.6.

 

Рис. 6: Database Desktop позволяет задать имена и типы полей в таблице.

 

Имя поля в таблице формата Paradox представляет собой строку, написание которой подчиняется следующим правилам:

· Имя должно быть не длиннее 25 символов.

· Имя не должно начинаться с пробела, однако может содержать пробелы. Однако, если Вы предполагаете в будущем переносить базу данных в другие форматы, разумнее будет избегать включения пробелов в название поля. Фактически, в целях переносимости лучше ограничиться девятью символами в названии поля, не включая в него пробелы.

· Имя не должно содержать квадратные, круглые или фигурные скобки [], () или {}, тире, а также комбинацию символов “тире” и “больше” (->).

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

Имя поля в таблице формата dBase представляет собой строку, написание которой подчиняется правилам, отличным от Paradox:

· Имя должно быть не длиннее 10 символов.

· Пробелы в имени недопустимы.

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

Укажем еще правила, которым подчиняется написание имен полей в формате InterBase.

· Имя должно быть не длиннее 31 символа.

· Имя должно начинаться с букв A-Z, a-z.

· Имя поля может содержать буквы (A-Z, a-z), цифры, знак $ и символ подчеркивания (_).

· Пробелы в имени недопустимы.

· Для имен таблиц запрещается использовать зарезервированные слова InterBase.

Следующий (после выбора имени поля) шаг состоит в задании типа поля. Типы полей очень сильно различаются друг от друга, в зависимости от формата таблицы. Для получения списка типов полей перейдите к столбцу “Type”, а затем нажмите пробел или щелкните правой кнопкой мышки. Приведем списки типов полей, характерные для форматов Paradox, dBase и InterBase.

Итак, поля таблиц формата Paradox могут иметь следующий тип (для ввода типа поля можно набрать только подчеркнутые буквы или цифры):

 

Табл. A: Типы полей формата Paradox

 

A lpha строка длиной 1-255 байт, содержащая любые печатаемые символы
N umber числовое поле длиной 8 байт, значение которого может быть положительным и отрицательным. Диапазон чисел – от 10-308 до 10308 с 15 значащими цифрами
$ (Money) числовое поле, значение которого может быть положительным и отрицательным. По умолчанию, является форматированным для отображения десятичной точки и денежного знака
S hort числовое поле длиной 2 байта, которое может содержать только целые числа в диапазоне от –32768 до 32767
Long I nteger числовое поле длиной 4 байта, которое может содержать целые числа в диапазоне от –2147483648 до 2147483648
# (BCD) числовое поле, содержащее данные в формате BCD (Binary Coded Decimal). Скорость вычислений немного меньше, чем в других числовых форматах, однако точность – гораздо выше. Может иметь 0-32 цифр после десятичной точки
D ate поле даты длиной 4 байта, которое может содержать дату от 1 января 9999 г. до нашей эры – до 31 декабря 9999 г. нашей эры. Корректно обрабатывает високосные года и имеет встроенный механизм проверки правильности даты

 

Продолжение таблицы А.

T ime поле времени длиной 4 байта, содержит время в миллисекундах от полуночи и ограничено 24 часами
@ (Timestamp) обобщенное поле даты длиной 8 байт – содержит и дату и время
M emo поле для хранения символов, суммарная длина которых более 255 байт. Может иметь любую длину. При этом размер, указываемый при создании таблицы, означает количество символов, сохраняемых в таблице (1-240) – остальные символы сохраняются в отдельном файле с расширением.MB
F ormatted Memo поле, аналогичное Memo, с добавлением возможности задавать шрифт текста. Также может иметь любую длину. При этом размер, указываемый при создании таблицы, означает количество символов, сохраняемых в таблице (0-240) – остальные символы сохраняются в отдельном файле с расширением.MB. Однако, Delphi в стандартной поставке не обладает возможностью работать с полями типа Formatted Memo
G raphic поле, содержащее графическую информацию. Может иметь любую длину. Смысл размера – такой же, как и в Formatted Memo. Database Desktop “умеет” создавать поля типа Graphic, однако наполнять их можно только в приложении
O LE поле, содержащее OLE-данные (Object Linking and Embedding) - образы, звук, видео, документы - которые для своей обработки вызывают создавшее их приложение. Может иметь любую длину. Смысл размера - такой же, как и в Formatted Memo. Database Desktop “умеет” создавать поля типа OLE, однако наполнять их можно только в приложении. Delphi “напрямую” не умеет работать с OLE-полями, но это легко обходится путем использования потоков
L ogical поле длиной 1 байт, которое может содержать только два значения - T (true, истина) или F (false, ложь). Допускаются строчные и прописные буквы
+ (Autoincrement) поле длиной 4 байта, содержащее нередактируемое (read-only) значение типа long integer. Значение этого поля автоматически увеличивается (начиная с 1) с шагом 1 - это очень удобно для создания уникального идентификатора записи (физический номер записи не может служить ее идентификатором, поскольку в Парадоксе таковой отсутствует. В InterBase также отсутствуют физические номера записей, но отсутствует и поле Autoincrement. Его с успехом заменяет встроенная функция Gen_id, которую удобней всего применять в триггерах)
B inary поле, содержащее любую двоичную информацию. Может иметь любую длину. При этом размер, указываемый при создании таблицы, означает количество символов, сохраняемых в таблице (0-240) - остальные символы сохраняются в отдельном файле с расширением.MB. Это полнейший аналог поля BLOb в InterBase
B y tes строка цифр длиной 1-255 байт, содержащая любые данные

 

Поля таблиц формата dBase могут иметь следующий тип (для ввода типа поля можно набрать только подчеркнутые буквы или цифры):

 

Табл. B: Типы полей формата dBase

 

C haracter (alpha) строка длиной 1-254 байт, содержащая любые печатаемые символы
F loat (numeric) числовое поле размером 1-20 байт в формате с плавающей точкой, значение которого может быть положительным и отрицательным. Может содержать очень большие величины, однако следует иметь в виду постоянные ошибки округления при работе с полем такого типа. Число цифр после десятичной точки (параметр Dec в DBD) должно быть по крайней мере на 2 меньше, чем размер всего поля, поскольку в общий размер включаются сама десятичная точка и знак
N umber (BCD) числовое поле размером 1-20 байт, содержащее данные в формате BCD (Binary Coded Decimal). Скорость вычислений немного меньше, чем в других числовых форматах, однако точность - гораздо выше. Число цифр после десятичной точки (параметр Dec в DBD) также должно быть по крайней мере на 2 меньше, чем размер всего поля, поскольку в общий размер включаются сама десятичная точка и знак
D ate поле даты длиной 8 байт. По умолчанию, используется формат короткой даты (ShortDateFormat)
L ogical поле длиной 1 байт, которое может содержать только значения “истина” или “ложь” - T,t,Y,y (true, истина) или F,f,N,n (false, ложь). Допускаются строчные и прописные буквы. Таким образом, в отличие от Парадокса, допускаются буквы “Y” и “N” (сокращение от Yes и No)
M emo поле для хранения символов, суммарная длина которых более 255 байт. Может иметь любую длину. Это поле хранится в отдельном файле. Database Desktop не имеет возможности вставлять данные в поле типа Memo
O LE поле, содержащее OLE-данные (Object Linking and Embedding) - образы, звук, видео, документы - которые для своей обработки вызывают создавшее их приложение. Может иметь любую длину. Это поле также сохраняется в отдельном файле. Database Desktop “умеет” создавать поля типа OLE, однако наполнять их можно только в приложении. Delphi “напрямую” не умеет работать с OLE-полями, но это легко обходится путем использования потоков
B inary поле, содержащее любую двоичную информацию. Может иметь любую длину. Данное поле сохраняется в отдельном файле с расширением.DBT. Это полнейший аналог поля BLOb в InterBase

 

 

Поля таблиц формата InterBase могут иметь следующий тип:

 

Табл. C: Типы полей формата InterBase

 

SHORT числовое поле длиной 2 байта, которое может содержать только целые числа в диапазоне от -32768 до 32767
LONG числовое поле длиной 4 байта, которое может содержать целые числа в диапазоне от -2147483648 до 2147483648
FLOAT числовое поле длиной 4 байта, значение которого может быть положительным и отрицательным. Диапазон чисел - от 3.4*10-38 до 3.4*1038 с 7 значащими цифрами
DOUBLE числовое поле длиной 8 байт (длина зависит от платформы), значение которого может быть положительным и отрицательным. Диапазон чисел - от 1.7*10-308 до 1.7*10308 с 15 значащими цифрами
CHAR строка символов фиксированной длины (0-32767 байт), содержащая любые печатаемые символы. Чи сло символов зависит от Character Set, установленного в InterBase для данного поля или для всей базы данных (например, для символов в кодировке Unicode число символов будет в два раза меньше длины строки)
VARCHAR строка символов переменной длины (0-32767 байт), содержащая любые печатаемые символы. Число символов также зависит от Character Set, установленного в InterBase для данного поля или для всей базы данных
DATE поле даты длиной 8 байт, значение которого может быть от 1 января 100 года до 11 декабря 5941 года (время также содержится)
BLOB поле, содержащее любую двоичную информацию. Может иметь любую длину. Database Desktop не имеет возможности редактировать поля типа BLOB
ARRAY поле, содержащее массивы данных. InterBase позволяет определять массивы, имеющие размерность 16. Поле может иметь любую длину. Однако, Database Desktop не имеет возможности не только редактировать поля типа ARRAY, но и создавать их
TEXT BLOB подтип BLOB-поля, содержащее только текстовую информацию. Может иметь любую длину. Database Desktop не имеет возможности редактировать поля типа TEXT BLOB

 

Итак, мы изучили все типы полей, являющиеся “родными” для Delphi.

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

После создания таблицы, с ней можно связать некоторые свойства, перечень которых зависит от формата таблицы. Так, для таблиц формата Paradox можно задать:

* Validity Checks (проверка правильности) - относится к полю записи и определяет минимальное и максимальное значение, а также значение по умолчанию. Кроме того, позволяет задать маску ввода

* Table Lookup (таблица для “подсматривания”) - позволяет вводить значение в таблицу, используя уже существующее значение в другой таблице

* Secondary Indexes (вторичные индексы) - позволяют доступаться к данным в порядке, отличном от порядка, задаваемого первичным ключом

* Referential Integrity (ссылочная целостность) - позволяет задать связи между таблицами и поддерживать эти связи на уровне ядра. Обычно задается после создания всех таблиц в базе данных

* Password Security (парольная защита) - позволяет закрыть таблицу паролем

* Table Language (язык таблицы) - позволяет задать для таблицы языковый драйвер.

В таблицах dBase не существует первичных ключей. Однако, это обстоятельство можно преодолеть путем определения уникальных (Unique) и поддерживаемых (Maintained) индексов (Indexes). Кроме того, для таблиц dBase можно определить и язык таблицы (Table Language) - языковый драйвер, управляющий сортировкой и отображением символьных данных.

Определения дополнительных свойств таблиц всех форматов доступны через кнопку “Define” (для таблиц InterBase данная кнопка называется “Define Index...” и позволяет определять лишь только индекс, но не первичный ключ) в правой верхней части окна (группа Table Properties). Причем, все эти действия можно проделывать не только при создании таблицы, но и тогда, когда она уже существует. Для этого используется команда Table|Restructure Table (для открытой в данный момент таблицы) или Utilities|Restructure (с возможностью выбора таблицы). Однако, если Вы желаете изменить структуру или добавить новые свойства для таблицы, которая в данный момент уже используется другим приложением, Database Desktop откажет Вам в этом, поскольку данная операция требует монопольного доступа к таблице. Но зато все произведенные в структуре изменения сразу же начинают “работать” - например, если Вы определите ссылочную целостность для пары таблиц, то при попытке вставить в дочернюю таблицу данные, отсутствующие в родительской таблице, в Delphi возникнет исключительное состояние.

В заключение отметим еще часто используемую очень полезную возможность Database Desktop. Создавать таблицу любого формата можно не только “с чистого листа”, но и путем копирования структуры уже существующей таблицы. Для этого достаточно воспользоваться кнопкой “Borrow”, имеющейся в левом нижнем углу окна. Появляющееся диалоговое окно позволит Вам выбрать существующую таблицу и включить/выключить дополнительные опции, совпадающие с уже перечисленными свойствами таблиц. Это наиболее легкий способ создания таблиц.

Управление таблицами можно осуществлять с помощью различных средств (SQL-скрипт в WISQL, компонент TTable, компонент TQuery), однако данная утилита позволяет делать это в интерактивном режиме наиболее простым способом.

 

8.3 Компоненты работы с БД.

 

Имеются несколько основных компонент (объектов) для доступа к БД. Эти объекты могут быть разделены на три группы:

· невизуальные: TTable, TQuery, TDataSet, TField

· визуальные: TDBGrid, TDBEdit

· связующие: TDataSource

Первая группа включает невизуальные классы, которые используются для управления таблицами и запросами. Эта группа сосредотачивается вокруг компонент типа TTable, TQuery, TDataSet и TField. В Палитре Компонент эти объекты расположены на странице Data Access.

Вторая важная группа классов - визуальные, которые показывают данные пользователю, и позволяют ему просматривать и модифицировать их. Эта группа классов включает компоненты типа TDBGrid, TDBEdit, TDBImage и TDBComboBox. В Палитре Компонент эти объекты расположены на странице Data Controls.

К третьему типу относится только невизуальный компонент TDataSource, который используется для того, чтобы связать предыдущие два типа объектов.

 

Класс TdataSet

TDataSet класс - базовый родительский класс

 

TDataSet

|

TDBDataSet

|

|-- TTable

|-- TQuery

|-- TStoredProc

 

TDataSet содержит абстрактные методы там, где должно быть непосредственное управление данными. TDBDataSet знает, как обращаться с паролями и то, что нужно сделать, чтобы присоединить Вас к определенной таблице. TTable знает (т.е. уже все абстрактные методы переписаны), как обращаться с таблицей, ее индексами и т.д.

TQuery имеет определенные методы для обработки SQL запросов.

TDataSet - инструмент, который используется, чтобы открыть таблицу, и перемещаться по ней. Конечно, Вы никогда не будете непосредственно создавать объект типа TDataSet. Вместо этого, Вы будете использовать TTable, TQuery или других потомков TDataSet (например, TQBE).

 

На наиболее фундаментальном уровне, Dataset это просто набор записей, как изображено на рис.7.

 

Рис 7: Любой dataset состоит из ряда записей, каждая содержит N полей, и указатель на текущую запись.

 

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

Методы, используемые Delphi для доступа к данным, хранящимся на диске в виде БД, принадлежат TDataSet. Почти всякий раз, когда программист на Delphi открывает таблицу, он будет использовать TTable или TQuery, которые являются просто некоторой надстройкой над TDataSet.

 

Открытие и закрытие DataSet

 

Если Вы используете TTable для доступа к таблице, то при открытии данной таблицы заполняются некоторые свойства TTable (количество записей RecordCount, описание структуры таблицы и т.д.).

Прежде всего, нужно заполнить в Инспекторе объектов свойства DatabaseName и TableName. В DatabaseName можно либо указать директорию, в которой лежат таблицы в формате dBase или Paradox, например, C:\DELPHI\DEMOS\DATA, либо выбрать из списка псевдоним базы данных (DBDEMOS). Псевдоним базы данных (Alias) определяется в утилите Database Engine Configuration. Теперь, если свойство Active установить в True, то при запуске приложения таблица будет открываться автоматически.

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

 

Table1.Open;

 

Или, если Вы предпочитаете, то можете установить свойство Active равное True:

 

Table1.Active:= True;

 

Метод Open, однако, сам заканчивается установкой свойства Active в True, так что может быть даже чуть более эффективно использовать свойство Active напрямую.

Также как имеются два способа открыть таблицу, так и есть два способа закрыть ее. Самый простой способ просто вызывать Close:

 

Table1.Close;

 

Или, если Вы желаете, Вы можете написать:

 

Table1.Active:= False;

 

Нет никакой существенной разницы между двумя этими способами. Вы должны только помнить, что Open и Close это методы (процедуры), а Active - свойство.

 

 

8.3.2 Навигация (Перемещение по записям)

 

После открытия a таблицы, Вы должны перемещаться по записям. Следующий обширный набор методов и свойства TDataSet обеспечивает все, что Вам нужно для доступа к любой конкретной записи внутри таблицы:

 

procedure First;

procedure Last;

procedure Next;

procedure Prior;

property BOF: Boolean read FBOF;

property EOF: Boolean read FEOF;

procedure MoveBy(Distance: Integer);

 

Дадим краткий обзор их функциональных возможностей:

· Вызов Table1.First перемещает Вас к первой записи в таблице.

· Table1.Last перемещает Вас к последней записи.

· Table1.Next перемещает Вас на одну запись вперед.

· Table1.Prior перемещает Вас на одну запись назад.

· Вы можете проверять свойства BOF или EOF, чтобы понять, находитесь ли Вы в начале или в конце таблицы.

· Процедура MoveBy перемещает Вас на N записей вперед или назад в таблице. Нет никакого функционального различия между запросом Table1.Next и вызовом Table1.MoveBy(1). Аналогично, вызов Table1.Prior имеет тот же самый результат, что и вызов Table1.MoveBy(-1).

Чтобы начать использовать эти навигационные методы, Вы должны поместить TTable, TDataSource и TDBGrid на форму. Присоедините DBGrid1 к DataSource1, и DataSource1 к Table1. Затем установите свойства таблицы:

· в DatabaseName имя подкаталога, где находятся демонстрационные таблицы (или псевдоним DBDEMOS);

· в TableName установите имя таблицы CUSTOMER.

Если программа содержит видимый элемент TDBGrid, то можно перемещаться по записям таблицы с помощью полос прокрутки (scrollbar) на нижней и правой сторонах DBGrid.

Однако, иногда нужно перемещаться по таблице “программным путем”, без использования возможностей, встроенных в визуальные компоненты. В следующих нескольких абзацах объясняется как можно это сделать.

Поместите две кнопки на форму и назовите их Next и Prior, как показано на рис.8.

 

Рис.8: Next и Prior кнопки позволяют Вам перемещаться по БД.

 

Дважды щелкните на кнопке Next - появится заготовка обработчика события:

 

procedure TForm1.NextClick(Sender: Tobject);

begin

end;

 

Теперь добавьте a одну строчку кода так, чтобы процедура выглядела так:

 

procedure TForm1.NextClick(Sender: TObject);

begin

Table1.Next;

end;

 

Повторите те же самые действия с кнопкой Prior, так, чтобы функция связанная с ней выглядела так:

 

procedure TForm1.PriorClick(Sender: TObject);

begin

Table1.Prior;

end;

 

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

Теперь добавьте еще две кнопки и назовите их First и Last, как показано на рис.9.

 

Рис.9: Программа со всеми четырьмя кнопками.

 

Сделайте то же самое для новых кнопок.

 

procedure TForm1.FirstClick(Sender: TObject);

begin

Table1.First;

end;

 

procedure TForm1.LastClick(Sender: TObject);

begin

Table1.Last;

end;

 

First перемещает Вас в начало таблицы, Last перемещает Вас в конец таблицы, а Next и Prior перемещают Вас на одну запись вперед или назад.

TDataSet.BOF - read-only Boolean свойство, используется для проверки, находитесь ли Вы в начале таблицы. Свойства BOF возвращает true в трех случаях:

· После того, как Вы открыли файл;

· После того, как Вы вызывали TDataSet.First;

· После того, как вызов TDataSet.Prior не выполняется.

Первые два пункта - очевидны. Когда Вы открываете таблицу, Delphi помещает Вас на первую запись; когда Вы вызываете метод First, Delphi также перемещает Вас в начало таблицы. Третий пункт, однако, требует небольшого пояснения: после того, как Вы вызывали метод Prior много раз, Вы могли добраться до начала таблицы, и следующий вызов Prior будет неудачным - после этого BOF и будет возвращать True.

Следующий код показывает самый общий пример использования Prior, когда Вы попадаете к началу a файла:

 

while not Table.Bof do begin

DoSomething;

Table1.Prior;

end;

 

В коде, показанном здесь, гипотетическая функция DoSomething будет вызвана, сперва, на текущей записи и, затем, на каждой следующей записи (от текущей и до начала таблицы). Цикл будет продолжаться до тех пор, пока вызов Table1.Prior не сможет больше переместить Вас на предыдущую запись в таблице. В этот момент BOF вернет True и программа выйдет из цикла. (Чтобы оптимизировать вышеприведенный код, установите DataSource1.Enabled в False перед началом цикла, и верните его в True после окончания цикла.)

Все сказанное относительно BOF также применимо и к EOF. Другими словами, код, приведенный ниже, показывает простой способ пробежать по всем записям в a dataset:

 

Table1.First;

while not Table1.EOF do begin

DoSomething;

Table1.Next;

end;

 

Классическая ошибка в случаях, подобных этому: Вы входите в цикл while или repeat, но забываете вызывать Table1.Next:

 

Table1.First;

repeat

DoSomething;

until Table1.EOF;

 

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

EOF возвращает True в следующих трех случаях:

· После того, как Вы открыли пустой файл;

· После того, как Вы вызывали TDataSet.Last;

· После того, как вызов TDataSet.Next не выполняется.

Единственная навигационная процедура, которая еще не упоминалась - MoveBy, которая позволяет Вам переместиться на N записей вперед или назад в таблице. Если Вы хотите переместиться на две записи вперед, то напишите:

 

MoveBy(2);

 

И если Вы хотите переместиться на две записи назад, то:

 

MoveBy(-2);

 

При использовании этой функции Вы должны всегда помнить, что DataSet - это изменяющиеся объекты, и запись, которая была пятой по счету в предыдущий момент, теперь может быть четвертой или шестой или вообще может быть удалена Prior и Next - это простые функции, которые вызывают MoveBy.

 

 

Поля

 

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

 

property Fields[Index: Integer];

function FieldByName(const FieldName: string): TField;

property FieldCount;

 

Свойство FieldCount возвращает число полей в текущей структуре записи. Если Вы хотите программным путем прочитать имена полей, то используйте свойство Fields для доступа к ним:

 

var

S: String;

begin

S:= Fields[0].FieldName;

end;

 

Если Вы работали с записью, в которой первое поле называется CustNo, тогда код показанный выше поместит строку “CustNo” в переменную S.

Если Вы хотите получить доступ к имени второго поля в вышеупомянутом примере, тогда Вы могли бы написать:

 

S:= Fields[1].FieldName;

 

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

Если Вы хотите прочитать текущее содержание конкретного поля конкретной записи, то Вы можете использовать свойство Fields или метод FieldsByName. Для того, чтобы найти значение первого поля записи, прочитайте первый элемент массива Fields:

 

S:= Fields[0].AsString;

 

Предположим, что первое поле в записи содержит номер заказчика, тогда код, показанный выше, возвратил бы строку типа “1021”, “1031” или “2058”. Если надо получить доступ к этой переменной, как к числовой величине, тогда можно использовать AsInteger вместо AsString. Аналогично, свойство Fields включают AsBoolean, AsFloat и AsDate.

Если хотите, Вы можете использовать функцию FieldsByName вместо свойства Fields:

 

S:= FieldsByName(‘CustNo’).AsString;

 

Как показано в примерах выше, и FieldsByName, и Fields возвращают те же самые данные. Два различных синтаксиса используются исключительно для того, чтобы обеспечить программистов гибким и удобным набором инструментов для программного доступа к содержимому DataSet.

Давайте посмотрим на простом примере, как можно использовать доступ к полям таблицы во время выполнения программы. Создайте новый проект, положите на форму объект TTable, два объекта ListBox и две кнопки - “Fields” и “Values” (см рис.10).

Соедините объект TTable с таблицей CUSTOMER, которая поставляется вместе с Delphi (DBDEMOS), не забудьте открыть таблицу (Active = True).

 

Рис.10: Программа FLDS показывает, как использовать свойство Fields.

 

Сделайте Double click на кнопке Fields и создайте a метод, который выглядит так:

 

procedure TForm1.FieldsClick(Sender: TObject);

var

i: Integer;

begin

ListBox1.Clear;

for i:= 0 to Table1.FieldCount - 1 do

ListBox1.Items.Add(Table1.Fields[i].FieldName);

end;

 

Обработчик события начинается с очистки первого ListBox1, затем он проходит через все поля, добавляя их имена один за другим в ListBox1. Заметьте, что цикл, показанный здесь, пробегает от 0 до FieldCount - 1. Если Вы забудете вычесть единицу из FieldCount, то Вы получите ошибку “List Index Out of Bounds”, так как Вы будете пытаться прочесть имя поля которое не существует.

Предположим, что Вы ввели код правильно, и заполнили ListBox1 именами всех полей в текущей структуре записи.

В Delphi существуют и другие средства, которые позволяют Вам получить ту же самую информацию, но это самый простой способ доступа к именам полей в Run Time.

Свойство Fields позволяет Вам получить доступ не только именам полей записи, но также и к содержимому полей. В нашем примере, для второй кнопки напишем:

 

procedure TForm1.ValuesClick(Sender: TObject);

var

i: Integer;

begin

ListBox2.Clear;

for i:= 0 to Table1.FieldCount - 1 do







Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор...

ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...

Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.