Главная страница
Навигация по странице:

  • Validity Checks

  • Referential Integrity

  • 5.4. Структурированный Язык Запросов SQL

  • 5.5. Команды языка манипулирования данными

  • Простейшие конструкции команды SELECT

  • Логические операторы

  • Изменение порядка выводимых строк

  • 5.6. Выполнение инструкций SQL

  • 5.7. Разработка приложений баз данных Механизм BDE

  • Использование визуальных компонентов.

  • БГУ Пособие - Программирование в C++ Builder. Учебное пособие по курсу методы программирования для студентов специальностей


    Скачать 1.24 Mb.
    НазваниеУчебное пособие по курсу методы программирования для студентов специальностей
    АнкорБГУ Пособие - Программирование в C++ Builder.pdf
    Дата26.05.2018
    Размер1.24 Mb.
    Формат файлаpdf
    Имя файлаБГУ Пособие - Программирование в C++ Builder.pdf
    ТипУчебное пособие
    #19699
    страница8 из 12
    1   ...   4   5   6   7   8   9   10   11   12
    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 ( [, | ...]); где 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() вы- зывает фактическое изменение содержимого базы данных.
    1   ...   4   5   6   7   8   9   10   11   12


    написать администратору сайта