БГУ Пособие - Программирование в C++ Builder. Учебное пособие по курсу методы программирования для студентов специальностей
Скачать 1.24 Mb.
|
5.3. Утилита Database Desktop Database Desktop – это старая утилита, которая поставляется для соз- дания таблиц и интерактивной работы с таблицами различных форматов. При этом могут использоваться таблицы для локальных баз данных типа Paradox, dBase, MSAccess а также распределенных и SQL-серверных баз данных InterBase, Oracle, Informix, Sybase. После запуска Database Desktop выберите команду меню File|New|Table для создания новой таблицы. Появится диалоговое окно выбора типа таблицы, например Paradox, DB2, dBase, MSAccess, MSSQL. После выбора типа таблицы появляется диалоговое окно, в котором можно определить поля таблицы и их тип. Таблицы создаются в online – режиме в рабочем пространстве DataBase Desktop, связанном с катало- гом, который необходимо предварительно установить. Для таблиц Paradox можно определить поля, находящиеся в начале записи и составляющие первичный ключ. Достаточно дважды щелкнуть мышкой по этому полю. С таблицей можно связать некоторые свойства. Validity Checks (проверка правильности) – относится к полю записи и определяет минимальное и максимальное значение поля, а также зна- чение по умолчанию. Table Lookup (таблица для “подсматривания”) – позволяет вводить значение в таблицу, используя уже существующее значение в другой таблице. В табл. 16 приведены типы полей записей для БД Paradox. 79 Таблица 16 Alpha Строка длиной от 1 до 255 байт Number Числовое поле длиной 8 байт для чисел от 10 -308 до 10 308 с 15 значащими цифрами Money Форматированное числовое поле для отображения денежного знака Short Числовое поле длиной 2 байта для целых чисел от - 32768 до 32767 Long Integer Числовое поле длиной 4 байта для целых чисел от - 2147483648 до 2147483648 BCD Числовое поле данных в формате BCD (Binary Coded Decimal). Может иметь от 0 до 32 цифр после деся- тичной точки Date Поле даты длиной 4 байта Time Время в миллисекундах от полуночи Timestamp Обобщенное поле даты длиной 8 байт. Содержит дату и время Memo Поле для хранения символов, суммарное число кото- рых превышает 255 Graphic Поле для графической информации OLE Содержит OLE-данные: образы, звук, видео Logical Содержит значения T(true) или F(false) Autoincrement) Содержит значение типа integer, которое автоматиче- ски увеличивается на 1, начиная с 1 Binary Cодержит любую двоичную информацию Bytes Строка длиной от 1 до 255 байт Secondary Indexes (вторичные индексы) – обеспечивают доступ к данным в порядке, отличном от задаваемого первичным ключом. Вто- ричные ключи могут использоваться в подчиненной таблице для указа- ния ссылки на главную таблицу. Referential Integrity (ссылочная целостность) – позволяет задать свя- зи между таблицами и поддерживать эти связи на уровне ядра. Password Security (парольная защита) – позволяет защитиь таблицу паролем. Table Language – позволяет задать языковый драйвер. Поля таблиц формата dBase описаны в табл. 17. В таблицах dBase не существует первичных ключей. Однако, это об- стоятельство можно преодолеть путем определения уникальных (Unique) и поддерживаемых (Maintained) индексов (Indexes). 80 Отметим, что использование утилиты Database Desktop является од- ним из способов создания таблиц. Например, таблицы можно создавать средствами конкретной СУБД. Таблица 17 Character Строка Float (numeric) Числовое поле размером от 1 до 20 байт Number (BCD) Числовое поле размером от 1 до 20 байт, содержащее данные в формате BCD Date Поле даты длиной 8 байт Logical Поле может содержать только значения “истина” – T, t, Y, y или ложь – F, f, N, n Memo Поле для хранения последовательности символов, длина которой превышает 255 байт OLE Поле, содержащее OLE-данные Binary Поле, содержащее двоичную информацию 5.4. Структурированный Язык Запросов SQL Язык Запросов SQL – основной язык для работы с реляционнми ба- зами данных. Состав языка SQL следующий: Язык манипулирования данными состоит из команд: SELECT (вы- брать), INSERT (вставить), UPDATE (обновить), DELETE (удалить). Язык определения данных используется для создания и изменения структуры БД и ее составных частей – таблиц, индексов, представлений (виртуальных таблиц). Основными его командами являются: CREATE DATABASE (создать базу данных), CREATE TABLE(создать таблицу), CREATE INDEX(создать индекс), CREATE PROCEDURE (создать со- храненную процедуру), ALTER DATABASE (модифицировать базу дан- ных), ALTER TABLE(модифицировать таблицу), ALTER INDEX(моди- фицировать индекс), ALTER PROCEDURE (модифицировать сохранен- ную процедуру), DROP DATABASE (удалить базу данных), DROP TABLE(удалить таблицу), DROP INDEX(удалить индекс), DROP PROCEDURE(удалить сохраненную процедуру). Язык управления данными (управления доступом) состоит из двух ос- новных команд: GRANT (дать права), REVOKE (забрать права). 5.5. Команды языка манипулирования данными Наиболее важной командой языка манипулирования данными явля- ется команда SELECT. Формат команды SELECT в языке SQL: SELECT поля FROM таблицы WHERE условие; 81 Базовыми операциями являются: выборка, проекция, соединение, объединение. Операция выборки позволяет получить все либо часть строк таблицы. SELECT * FROM Student; – Получить все строки таблицы Student SELECT * FROM Student WHERE Kurs=2 – Получить подмножество строк таблицы, удовлетворяющих условию Kurs=2. Точка с запятой яв- ляется стандартным признаком конца команды, который вставляется ав- томатически. Операция проекции позволяет выделить подмножество столбцов таб- лицы. SELECT StudName FROM Student WHERE Kurs=2; – Получить имена студентов второго курса. Операция соединения позволяет соединять строки из более чем одной таблицы: SELECT StudName, Exammark FROM Students, Exams WHERE Stu- dents.Stud_Id =Exams.Stud_Id – Получить список студентов и экзамена- ционных оценок. Операция объединения позволяет объединять результаты отдельных запросов. Предложение UNION объединяет вывод двух или более SQL- запросов. SELECT name FROM employee WHERE country = "Беларусь" UNION SELECT contact_nаме, FROM customer WHERE country = "Беларусь"; – Получить список работников и заказчиков, проживающих в Беларуси. Простейшие конструкции команды SELECT. Список выбираемых элементов может содержать: имена полей, символ ‘*’, вычисления, лите- ралы, функции, агрегирующие конструкции. Вычисления: SELECT StudName, Summa, Summa * 1.15 FROM Stipend – Получить список студентов и их стипендию, в том числе увеличенную на 15%. Литералы. Для наглядности результата в запросах можно использо- вать литералы – строковые константы, заключенные в одинарные или двойные кавычки. Например: SELECT StudName, "получает", Summa, " в месяц" FROM Stipend Два или более столбца, имеющих строковый тип, можно соединять друг с другом, а также с литералами с помощью операции конкатенации (||). Например: SELECT "сотрудник " || first_name || " " || last_name FROM Prepods Работа с датами. В языке SQL имеются возможности конвертирова- ния дат в строки и работы с датами. Внутренне дата содержит значения 82 даты и времени. Внешне дата может быть представлена строками раз- личных форматов, например: • “October 27, 2005” • “10/27/2005” Дата может неявно конвертироваться в строку (из строки), если име- ет один из допустимых форматов. Например: SELECT StudName, ExamDate FROM Student, Exams WHERE Exam- Date > '6/01/06' – получить список студентов, сдававших экзамен после 6/06/06. Значения дат можно сравнивать, а также вычитать одну дату из дру- гой. Агрегатные функции. К агрегатным функциям относятся функции вычисления суммы (SUM), максимального (MAX) и минимального (MIN) значений столбцов, среднего арифметического (AVG), количества строк, удовлетворяющих заданному условию. Например: SELECT count(*),sum(budget),avg (budget), min(budget), max(budget) FROM de- partment WHERE head_dept = 100 – вычислить количество отделов, являющихся подразделениями отдела 100, их суммарный, средний, минимальный и максимальный бюджеты. Условия отбора. Директива WHERE содержит условия отбора (пре- дикат). Запрос возвращает только строки, для которых предикат имеет значение true. Типы предикатов, используемых в предложении WHERE: Сравнение: = (равно); <> (не равно); != (не равно); > (больше); < (меньше); >= (больше или равно); <= (меньше или равно); BETWEEN, IN , LIKE, CONTAINING, IS NULL, EXIST, ANY, ALL. Предикат BETWEEN задает диапазон значений, для которого истин- но значение выражения. Например: SELECT StudName, Stipend FROM Student WHERE Stipend BETWEEN 120 AND 200 – получить список студентов стипендия кото- рых больше 120 и меньше 200. Тот же запрос с использованием операторов сравнения будет выгля- деть следующим образом: SELECT StudName, Stipend FROM Student WHERE Stipend>=120000 AND Stipend<=200000 Предикат IN (NOT IN) проверяет, входит ли заданное значение, предшествующее ключевому слову “IN”, в указанный в скобках список. Например: SELECT name FROM employee WHERE job_code IN ("VP", "Admin", "Finan") – получить список сотрудников, занимающих должности “вице- президент”, “администратор”, “финансовый директор”. 83 Предикат LIKE проверяет, соответствует ли данное символьное зна- чение строке с указанной маской. В качестве маски используются все разрешенные символы (с учетом верхнего и нижнего регистров), а также специальные символы: % – замещает любое количество символов, _ – замещает только один символ. Например: SELECT StudName FROM Student WHERE StudName LIKE "Ф%" – получить список студентов, фамилии которых начинаются с буквы ‘Ф’. Предикат CONTAINING аналогичен предикату LIKE, однако он не чувствителен к регистру букв. Предикат IS NULL принимает значение true только тогда, когда вы- ражение слева от “IS NULL” имеет значение null (пусто, не определено). Логические операторы. К логическим операторам относятся NOT, AND, OR.В одном предикате логические операторы выполняются в ука- занном порядке. Преобразование типов. В SQL имеется возможность преобразовать значение к другому типу для выполнения операций сравнения. Для этого используется функция CAST. Изменение порядка выводимых строк. Порядок выводимых строк может быть изменен с помощью предложения ORDER BY в конце SQL- запроса. Это предложение имеет вид: ORDER BY [ASC | DESC] Способом по умолчанию является упорядочивание “по возрастанию” (ASC). Если указано “DESC”, упорядочивание производится “по убыва- нию”. Например: SELECT StudName, Stipend FROM Student ORDER BY StudName – получить список в алфавитном порядке. Операция соединения. Используется в языке SQL для вывода свя- занной информации, хранящейся в нескольких таблицах. Операции под- разделяются на внутренние и внешние. Связывание производится, как правило, по первичному ключу одной таблицы и внешнему ключу дру- гой таблицы. Предложение WHERE может содержать множественные условия соединений. Внутренние соединения. Внутреннее соединение возвращает только те строки, для которых условие соединения принимает значение true. Рассмотрим пример запроса: SELECT StudName, ExamMark FROM Student, Exams WHERE Kurs=2 AND ExamMark=5 – получить список студентов 2-го курса, сдававших экзамен на 5. В запросе можно использовать способ непосредственного указания таблиц или указания таблиц с помощью алиасов (псевдонимов). 84 Внешние соединения. Внутреннее соединение возвращает только строки, для которых условие соединения принимает значение true. Внешнее соединение возвращает все строки из одной таблицы и те стро- ки из другой таблицы, для которых условие соединения принимает зна- чение true. Существуют два вида внешнего соединения: в левом соеди- нении (LEFT JOIN) запрос возвращает все строки из таблицы, стоящей слева от LEFT JOIN и только те из правой таблицы, которые удовлетво- ряют условию соединения. Для правого соединения – все наоборот. На- пример: SELECT name, department FROM employee e LEFT JOIN department d ON e.dept_no = d.dept_no – получить список сотрудников и название их отделов, включая сотрудников, еще не назначенных ни в какой отдел. 5.6. Выполнение инструкций SQL Для выполнения инструкции SQL создается содержащая ее строка и передается свойству SQL компонента TQuery. Компонента TQuery, должна быть помещена на форму, ее свойство DatabaseName настроено на нужный алиас (если базы данных не существует, можно создать ее в SQL Explorer). Для создания статического запроса можно ввести SQL-предложение в свойство SQL компонента TQuery. Способ создания динамического запроса состоит в создании строки и добавлении ее в свойство SQL при выполнении приложения. Для выпол- нения запроса, изменяющего структуру данных, вставляющего или об- новляющего данные на сервере, нужно вызвать метод ExecSQL() компо- нента TQuery. Например: Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("Delete * from Country where Name = 'Blr' "); Query1->ExecSQL(); Приведем упрощенный синтаксис SQL-предложения для создания таблицы на SQL-сервере: CREATE TABLE table ( [] означают необязательность, вертикальная черта | означает “или”). Приведем несколько примеров создания таблиц с помощью SQL. Пример. Простая таблица с конструкцией PRIMARY KEY на уровне поля: 85 CREATE TABLE REGION ( REGION REGION_NAME NOT NULL PRIMARY KEY, POPULATION INTEGER NOT NULL); Предполагается, что в базе данных определен домен REGION_NAME, например, следующим образом: CREATE DOMAIN REGION_NAME AS VARCHAR(40) CHARACTER SET WIN1251 COLLATE PXW_CYRL; Для выполнения запроса на получение данных с помощью оператора SELECT, нужно вызвать метод Open() компонента TQuery. Queryl->Close (); Queryl->SQL->Clear ();//Очистить свойство SQL от запроса Queryl->SQL->Add(str) ; //Присвоить текст свойству SQL Query1->Open(); // выполнить команду SQL 5.7. Разработка приложений баз данных Механизм BDE. Механизм BDE (Borland Database Engine), обеспе- чивающий работу визуальных компонентов баз данных, действует как интерфейс между приложением и базой данных. BDE обращается к драйверам для баз данных указанного типа, возвращая запрошенные данные. Используя BDE, можно получить доступ к локальным стандарт- ным базам данных, к источникам данных ODBC и к SQL-серверам баз данных. Чтобы получить доступ к содержимому базы данных, приложе- нию необходимо знать только ее алиас. Использование визуальных компонентов. C++Builder предостав- ляет разработчикам компоненты для работы с базами данных из VCL: 1. Компоненты управления данными на вкладке Data Control (такие как TDBEdit, сетка TDBGrid или DBNavigator) для отображения и ре- дактирования записей на форме. 2. Компоненты доступа к данным на вкладке Data Access. Компонент источника TDataSource служит как интерфейс межкомпонентной связи между таблицей TTable или запросом Tquery и компонентой управления. C++Builder поддерживает трехступенчатую модель разработки при- ложения баз данных. В этой модели компонент управления связан с ком- понентом источника TDataSource, а тот, в свою очередь, получает факти- ческие данные из таблицы или запроса посредством механизма BDE. Рассмотрим работу компонента доступа. Источники данных. Невидимый компонент TDataSource действует как интерфейс между некоторым объектом набора данных (таблица, за- прос) и визуальным компонентом управления. С одной стороны, все на- боры данных должны быть ассоциированы с некоторым источником. С другой стороны, каждый компонент управления должен быть ассоцииро- 86 ван с источником, чтобы получать данные для отображения и редактиро- вания. Свойство DataSet компонента TDataSource определяет имя конкрет- ного набора данных (таблицы или запроса), который питает данный ис- точник. С помощью этого свойства можно переключаться с одного набо- ра данных на другой во время выполнения программы. Следующий код реализует попеременное подключение объекта источника DataSource1 к таблице заказчиков "Заказчики" или к таблице "Заказы": if (DataSourcel->DataSet == "Заказчики") DataSourcel->DataSet = "Заказы"; Чтобы синхронизировать работу компонентов управления на двух формах, достаточно установить свойство DataSet на один и тот же набор данных: void__fastcall TForm2::FormCreate (TObject *Sender) { DataSource1->DataSet = Form1->Table1;} С компонентом TDataSource связаны три события. Событие On- DataChange возникает при перемещении курсора на новую запись. Собы- тие OnStateChange возникает при изменении свойства State наборов дан- ных. Например, следующий обработчик события будет отслеживать из- менения состояния таблицы MyTable. void__fastcall TForm1::StateChange(TObject *Sender) {String s;; switch (MyTable->State) { case dsInactive: s="Таблица неактивна"; break; case dsBrowse: s = "Идет просмотр"; break; case dsEdit: s = "Идет редактирование"; break; case dsInsert: s = "Идет вставка записи"; break; } // Вывод текстовой строки s Form1->Caption=s; } Событие OnUpdateData возникает перед фактическим обновлением текущей записи. 3. Компоненты DDE. Таблицы. Компонент TTable устанавливает прямую связь с таблицей базы данных посредством BDE, причем все записи или столбцы этой таблицы становятся доступными для приложения. Свойство Active компонента разрешает или запрещает режим про- смотра "живых данных" таблицы на этапе проектирования. Значение true или метод Open() открывают просмотр таблицы. Значение false или ме- тод Close() закрывают просмотр. 87 Свойство DatabaseName содержит псевдоним базы данных или путь к ее каталогу. Использование псевдонима всегда предпочтительнее: вы можете переназначить физический носитель данных. Перекомпиляция приложения не требуется – просто измените путь на вкладке Aliases в утилите конфигурации BDE. Свойство TableName позволяет выбрать фактическое имя таблицы из выпадающего списка. Свойство Exclusive разрешает или запрещает другому приложению обращаться к таблице, пока вы ее используете сами. Свойство IndexFiles открывает диалог выбора индексного файла для таблицы. Свойство IndexName задает правило сортировки данных, отличное от упорядочивания по первичному ключу (primary key order). Свойство Filter позволяет устанавливать критерий фильтрации, в со- ответствии с которым адресуется некоторое подмножество записей таб- лицы. Свойства MasterFields и MasterSource участвуют в образовании связи двух таблиц (ведущей и ведомой) по принципу master-detail. С компонентом TTable связаны следующие методы: GotoCurrent() – синхронизирует перемещения курсора по нескольким табличным компонентам, ассоциированным с одной и той же фактиче- ской таблицей. First(), Next(), Prior(), Last() и MoveBy() – используются для навига- ции по данным таблицы. SetKey(), FindKey(), FindNearest(), GotoKey() и GotoNearest() – ис- пользуются для поиска по специфическим значениям ключей. Append(), Insert(), AppendRecord() и InsertRecord() добавляют новую запись к таблице. Delete() – вычеркивает текущую запись. Edit() – разрешает приложению модифицировать записи, a Post() вы- зывает фактическое изменение содержимого базы данных. |