35139

Поддержка сложных запросов в файл-серверной информационной системе с использованием технологий Borland

Практическая работа

Информатика, кибернетика и программирование

Способным работать независимо от того отсутствуют ли требуемые таблицы или наличествуют и заполнены данными. Например: SELECT fio FROM stud; – выборка поля fio из всех записей таблицы stud SELECT fio n_spect FROM stud; – выборка полей fio n_spect из таблицы stud SELECT FROM stud; – выборка всех полей из таблицы stud SELECT s. FROM stud S s; – выборка всех полей из таблицы stud с присваиванием таблице псевдонима s SELECT s.n_spect S spect FROM stud S s; – выборка из таблицы stud полей fio и n_spect с присваиванием им...

Русский

2013-09-09

59.5 KB

0 чел.

Практическая работа №3

Поддержка сложных запросов в файл-серверной информационной системе с использованием технологий Borland

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

Использование сложных запросов

Для формирования сложных SQL-запросов, в частности для связывания нескольких таблиц, фильтрации, сортировки и т.п., используют компонент TQuery. В его свойство SQL вписывают текст запроса и выполняют его установкой в true свойства Active. Текст формируется в соответствии с общими нотациями SQL. Текст запроса может как задаваться разработчиком однократно, так и формироваться в программе в зависимости от сделанных установок.

Компонент TQuery может использоваться не только для выборки, но и для модификации данных. При этом применяется его метод ExecSQL.

Синтаксис SQL

Оператор SELECT

Оператор SELECT предназначен для выборки данных из БД. Его общий синтаксис:

SELECT [DISTINCT] <список полей>

FROM <список источников>

[WHERE <условие отбора>]

[GROUP BY <группирующее выражение>

[HAVING <условие группировки>]]

[ORDER BY <сортирующее выражение>]

Здесь, как обычно квадратными скобками обозначены необязательные части выражения.

<список полей> представляет собой одно имя поля или перечень имен полей, разделенных запятыми. Например:

SELECT fio FROM stud; – выборка поля fio из всех записей таблицы stud

SELECT fio, n_spect FROM stud; – выборка полей fio, n_spect из таблицы stud

SELECT * FROM stud; – выборка всех полей из таблицы stud

SELECT s.* FROM stud AS s; – выборка всех полей из таблицы stud (с присваиванием таблице псевдонима s)

SELECT s.fio AS s_f, s.n_spect AS spect FROM stud AS s; – выборка из таблицы stud полей fio и n_spect с присваиванием им псевдонимов.

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

Как понятно из вышеприведенных примеров, <список источников> представляет собой одно или несколько имен таблиц (разделенных запятыми), из которых производится выборка данных. Если имена таблиц перечисляются через запятую, то результатом такой выборки будет так называемое полное соединение (аналог декартового произведения множеств), т.е. каждой строке одной исходной таблицы будет сопоставлена каждая строка другой исходной таблицы. Практическая необходимость в выполнении выборок такого рода имеется далеко не всегда. Для ограничения соединений используют выражение WHERE. Например:

SELECT st.fio, sp.name_s

FROM stud AS st, spect AS sp

WHERE st.n_spect = sp.n_spect;

Здесь выбирается поле fio из таблицы stud и поле name_s из таблицы spect. Причем, в результирующий набор записей входят только такие сочетания записей из двух исходных таблиц, для которых выполняется условие WHERE. Для выполнения соединений таблиц используется также синтаксис, расширяющий <список источников> путем использования выражений семейства JOIN. В <условии отбора> могут также использоваться различные арифметические и логические выражения.

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

Более подробное рассмотрение синтаксиса SELECT выходит за пределы данной работы.

Оператор INSERT

Оператор INSERT предназначен для вставки записей в таблицы. Синтаксис:

INSERT INTO <имя таблицы> (<список полей>) VALUES (<список значений>)

Например:

INSERT INTO stud (nz, fio, data_p, n_fclt, n_spect, kurs, n_grup n_pasp) VALUES (‘000001’, ‘Иванов Иван Иванович’, ’01.07.2012’, 2, ‘ИТ’, 1, ‘12’, ’44 00 123456’);

Оператор UPDATE

Оператор UPDATE предназначен для модификации записей таблицы. Синтаксис:

UPDATE <имя таблицы> SET <список выражений присваивания> [WHERE <условие>]

<список выражений присваивания> состоит из однотипных выражений, разделенных запятыми, каждое из которых представляет собой следующую конструкцию: <имя поля> = <значение>. Установка значений выполняется только для тех записей, для которых выполняется <условие>. Например:

UPDATE stud SET kurs=2, n_grup=’22’ WHERE n_grup=’12’;

Оператор DELETE

Оператор DELETE предназначен для удаления записей таблицы. Синтаксис:

DELETE FROM <имя таблицы> [WHERE <условие>]

Создание вычисляемых полей

Для создания вычисляемого поля в редакторе полей создается новое поле командой New Field. При этом в окне New Field указывают: FieldTypeCalculated, Name – имя вычисляемого поля, Component – имя соответствующего невизуального компонента (можно не изменять), Type – тип значения поля, Size – размер.

После этого определяется событие OnCalcFileds соответствующего компонента TTable или TQuery. В создаваемой при этом процедуре вычисляется значение поля.

Создание полей Lookup

При реализации связей «один-к-одному» возникает задача получения при навигации по главной таблице значения некоторого поля связанной с ней подчиненной. Для этого используются Lookup-поля. Для определенности установим, что поле связки в главной таблице Master называется MasterKeyField, поле связки в подчиненной таблице DetailDetailKeyField, поле в подчиненной таблице, доступ к которому необходим из главной, – DetailDataField.

В редакторе полей главной таблицы создается новое поле командой New Field. В окне New Field устанавливаются: FieldTypeLookup, Name – имя поля, Component – имя компонента, Type – тип значения поля (должен совпадать с типом DetaildataField), Key FieldsMasterKeyField, LookupKeysDetailKeyField, DatasetDetail, Result FieldDetailDataField.

Программный доступ к БД

Простейшая форма доступа к таблицам – просмотр и редактирование таблицы при помощи компонента TDBGrid, а также навигация при помощи компонента TDBNavigator. Все те же операции навигации и редактирования можно выполнять программно.

Открытие и закрытие таблиц и запросов осуществляется при помощи свойства Active и методов Open и Close. Навигация выполняется при помощи методов First – переход к первой записи, Last – переход к последней записи, Prior – переход к предыдущей записи, Next – переход к следующей записи, Locate – поиск записи по значению полей.

Поиск записи при помощи метода Locate выполняется следующим образом:

Пример 1:

Variant  FieldValue;  // искомое значение

TLocateOptions Opts;   // настройки поиска

TQuery  Q;   // запрос

 Opts.Clear(); // очистка настроек поиска

 // инициализация значения FieldValue

if (Q->Locate ( "FNAME", FieldValue, Opts ) )

 {

 // запись найдена

}

Пример 2:

Variant  Values [2];

TLocateOptions Opts;

TQuery  Q;

Opts.Clear();

Values[0] = …; //инициализация искомых значений

 Values[1] = …;

if ( Q->Locate ( "FNAME1;FNAME2", VarArrayOf (Values, 1), Opts ) )

{

 // запись найдена

}

В первом примере осуществляется поиск записи, в которой значение поля FNAME равно искомому. Во втором примере осуществляется поиск записи в которой значения полей FNAME1, FNAME2 равны элементам массива Values.

Вставка записей в таблицу осуществляется при помощи методов Append и Insert. Запуск любого из этих методов переводит таблицу в режим вставки новой записи. Все изменения значений полей, которые после этого будут сделаны, фиксируются методом Post.

Редактирование записей в таблице осуществляется при помощи метода Edit. Он переводит таблицу в режим редактирования текущей записи. Все изменения значений полей, которые после этого будут сделаны, также фиксируются методом Post.

Пример :

Table1->Edit();

Table1->FieldByName(“FIELD1”)->AsString = “string”;

Table1->FieldByName(“FIELD2”)->AsInteger = 5;

Table1->Post();

Table1->Insert();

Table1->FieldByName(“FIELD1”)->AsString = “str”;

Table1->FieldByName(“FIELD2”)->AsInteger = 10;

Table1->Post();

Использование объекта TDataModule

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

Класс TDataModule имеет, кроме конструктора, всего два события: OnCreate – при создании объекта и OnDestroy – при удалении объекта. Рекомендации по использованию этих процедур:

  1.  В конструкторе закрыть все наборы данных и БД. Это делается с целью устранить ситуацию, когда неверно настроенные наборы данных были по ошибке оставлены разработчиком активизированными.
  2.  В методе OnCreate открыть/создать необходимые БД и наборы данных с контролем корректности открытия.
  3.  В методе OnDestroy сохранить и закрыть все наборы данных и БД.

Такой подход позволяет программно настраивать обращение к БД (например, брать путь из конфигурации и т.д.) и контролировать ошибки.

Программное создание таблицы

Таблица может быть создана не только при помощи DBD, но и программно. Программное открытие/создание таблицы демонстрирует пример:

Open = true;

Table->TableName = “T.DBF”;  //устанавливаем имя таблицы

try

{

Table->Active = true;  // попытка открытия таблицы

}

catch (…)

{

 Open = false; // сброс флага удачного открытия

}

if (!Open)  // не удалось открыть таблицу

 try

{

 Table->TableType = ttFoxPro;  // тип - FoxPro

 TFieldDef *pDef = Table->FieldDefs->AddFieldDef(); //поля

 pDef->Name = “FIELD1”;

 pDef->DataType = ftInteger;

 pDef = Table->FieldDefs->AddFieldDef();

 pDef->Name = “FIELD2”;

 pDef->DataType = ftString;

 pDef->Size = 15;

 …

 Table->CreateTable();

 Table->Active = true;

 }

 catch (…)

{

 // неудачное создание таблицы

}

Задание

Для выполнения задания воспользоваться вариантом практической работы №1 и базами данных, разработанными в ходе ее выполнения.

  1.  Создать проект, разместив в нем все компоненты доступа к данным в контейнере DataModule. Выборку данных из таблиц выполнить с использованием компонента TQuery. Изучить возможности модификации данных в компоненте TDBGrid, выбранных при помощи TQuery (выборка из одной таблицы, нескольких таблиц, настройки компонента TQuery и т.п.).
  2.  Реализовать формы редактирования и добавления записей в таблицу с использованием компонентов TQuery и запросов INSERT, UPDATE, DELETE.
  3.  Реализовать «клон» проекта с программным созданием таблиц.


 

А также другие работы, которые могут Вас заинтересовать

20957. Робота Антивірусу Касперського 593 KB
  Вивчення інтерфейсу У цім завданні вивчається інтерфейс Антивірусу Касперського. У ньому також розташовані посилання на інші вікна  Вікна настроювань призначеного для настроювання завдань і компонентів  Вікна статистики й звітів у якому можна одержати дані про результати роботи антивірусу  Вікна довідкової системи У ході виконання завдання потрібно буде по черзі викликати всі чотири вікна інтерфейсу Антивірусу Касперського й ознайомитися з їхнім зовнішнім виглядом. Після успішного завершення процесу установки Антивірусу Касперського в...
20959. Національно-культурне піднесення 1920-1930-х рр.. Українська культура в період тоталітаризму 1.42 MB
  Початок 1920-х років було для української культури позбавленим світлих перспектив. Розділ Україні між сусідніми державами гальмував національну інтеграцію, в тому числі і в сфері культури. Культурний потенціал Україні був підірваний руйнівними наслідками громадянської війни, часткової окупацією країни. Військове лихоліття не тільки знищило духовні і матеріальні цінності, а й основного творця культурних цінностей - інтелігенцію.
20960. ПАРОЛЬНИЙ ЗАХИСТ 101 KB
  Текст програми include iostream include fstream include conio.h include string include iomanip include windows.h using namespace std; string decrypt string str { for unsigned int i=0; i str.size; i if str[i]=' ' str[i]=charabsshortstr[i]255; return str; } string encrypt string str { for unsigned int i=0; i str.
20961. Шифрування та дешифрування даних за допомогою алгоритмів перестановки (збивання) 141.09 KB
  У якості інформації використовувати копію файлу з розробленою програмою програма дешифрування інформації повернення початкового вигляду файла; Індивідуальні завдання: Метод €œспутаної шини€ Текст програми: DEFINT IN: DEFSTR S RANDOMIZE 231 CLS: LOCATE 1 1 Lot = 5 s = FOR i=1 TO 64:s=sCHR6525RND:NEXT PRINT s; text : sav = s s = FOR i=1 TO 192: s=sCHR255RND: NEXT 'шифрование FOR i = 0 TO Lot sc=MIDss1I3232 l=2^i:sl= : r= FOR j = 1 TO 32 kg=ASCMIDsc j 1 kl=ASCMIDs j 1...
20962. Шифрування та дешифрування даних за допомогою алгоритмів підстановки (заміна) 69.72 KB
  Програма дешифрування інформації повернення початкового вигляду файла; а також оцінити правильність процедури €œшифрування – дешифрування€ відсутність зміни результату відносно початкового файлу. Підготовка даних полягає в: Введення вихідного тексту; Створення тимчасового текстового файлу файл 1 та занесення в нього вихідного тексту; Створення тимчасового текстового файлу файл 2 для подальшого занесення в нього результатів роботи програми; Введенні або автоматичному виборі ключа; Для режиму дешифрування якщо ключ...
20963. Шифрування та дешифрування даних з використанням режиму шифрування 98.95 KB
  Індивідуальні завдання: алгоритм Counter Mode CTR Текст програми AutoSeededRandomPool prng; SecByteBlock keyAES::DEFAULT_KEYLENGTH; prng.size ; byte ctr[ AES::BLOCKSIZE ]; prng.GenerateBlock ctr sizeofctr ; string plain = CTR Mode Test ; string cipher encoded recovered; try { cout plain text: plain endl; CTR_Mode AES ::Encryption e; e.size ctr ; The StreamTransformationFilter adds padding as required.
20964. Шифрування та дешифрування даних за допомогою алгоритмів гамування 30.38 KB
  Індивідуальні завдання : конгруэнтные генераторы Линейными конгруэнтными генераторами являются генераторы следующей формы: в которых это nый член последовательности а предыдущий член последовательности. Период такого генератора не больше чем m. Если a b и m подобраны правильно то генератор будет генератором с максимальным периодом и его период будет равен m. Например для линейного конгруэнтного генератора b должно быть взаимно простым с m.
20965. Використання алгоритмів шифрування з відкритими ключами 45.99 KB
  Постановка задачі Необхідно розробити і налагодити дві програми: Програма шифрування інформації з використанням визначених алгоритмів. Програма дешифрування інформації повернення початкового вигляду файла; а також оцінити правильність процедури €œшифрування – дешифрування€ відсутність зміни результату відносно початкового файлу.09 funkcja f dla kazdej rundy czynniki pierwsze klucz zakryty p1 4 = 0 q1 4 = 0 p = 19; q = 23; n = pq; M = random n; print Message = M; print Cryptogram = C; C = M^2 n; m1= C ^...