Использование преимуществ клиент-серверной архитектуры при проектировании приложений БД в Delphi

Страницы работы

Содержание работы

Инструкция написана к лабораторным работам для студентов-экономистов.

Лабораторная работа № 4.

Использование преимуществ клиент-серверной архитектуры

при проектировании приложений БД в Delphi.

Созданная на прошлом занятии программа не реализует всех преимуществ архитектуры клиент-сервер. В частности при расположении БД где-либо в сети она требует пересылки по сети всех таблиц целиком. Если таблицы достаточно большие, это может серьёзно загрузить сеть. При работе с Intebase-сервером, запущенном на локальном компьютере, эти недостатки ярко себя не проявляли, при работе в сети они могут существенно замедлить работу.

Итак, модифицируем нашу программу для работы в сети. Модификация будет проведена для TCP/IP — сети. К сожалению, в рамках данных методических указаний подключение к сетевому серверу будет жестко записано в программном коде без возможности это подключение поменять. Предположим, наш сервер БД запущен на узле   interbasehost, а база данных расположена на нем в каталоге c:\databases, тогда  процедуру подключения к БД (обработчик меню «open») можно переписать следующим образом:

begin

MyBase.Params.Values['database']:='interbasehost:c:\databases\querty.fdb';

MyBase.Open;

    Stud_Table.open;

    Usp_Table.Open;

    Disc_Table.open;

  end;

Следующий  наш шаг —  настройка объектов TsimpleDataSet таким образом, чтобы они содержали только нужные пользователю данные (например, студентов только одной группы, дисциплины только одной кафедры и т.п.).

Для этого дополним нашу форму DataModule1 еще одной парой SimpleDataSet + DataSource. Переименуем их, например, в Group_Set  и Group_Source. Установим свойства в следующие значения компонента Group_Set:

connection               MyBase

commandType              ctQuery

commandText              Select distinct gruppa from student;

У компонента Group_Source зададим свойство

Dataset                  Group_Set

В первой строке задается вид объекта  Group_Set это будет запрос. во второй строке записывается  текст этого запроса на SQL.

Замечание.  При изменении свойства CommandText в запросах настоятельно рекомендуется имена таблиц и полей писать с соблюдением регистра!

Далее поместим на главную форму компонент ComboBox, и поменяем его  свойства

DataSource               DataModule1.Group_source

Name                     Group_select

Теперь на главной форме у нас добавлен список имеющихся групп. Чтобы в нем отображалась хотя бы одна  запись,  после подключения к БД (в обработчике подключения) следует добавить строчки (помним, что эти строки внутри блока with DataModule1 do...):

  Group_set.Open;

  SDIAppForm.Group_select.Items.clear;  //очистим старый список групп

Group_set.First;

    while not Group_set.Eof do

    begin

{*}   SDIAppForm.Group_select.Items.Add(Group_set.FieldByName('gruppa').Value);

Group_Set.Next;

    end;

Строка, помеченная звездочкой добавляет в список групп очередную новую группу.

Отображаемый список групп пока никак не влияет на состав студентов в списке. Для того, чтобы отображались только студенты выбранной группы необходимо у объекта Stud_Table поменять свойства:

Dataset.CommandType            ctQuery

Dataset.CommandText            Select * from student where gruppa=:gruppa;

Последняя строчка представляет собой так называемый параметрический запрос, результатом которого будут все поля таблицы student, значение группы у которых равно параметру :gruppa. Значение этого параметра следует менять по событию выбора новой группы в  компоненте Group_Select на главной форме. После смены значения параметра следует закрыть и вновь открыть компонент Stud_Table. Полный текст обработчика таким образом может выглядеть так:

  Stud_Table.Params.ParamByName('gruppa').Value:=SDIAppForm.Group_select.Text;

Stud_Table.Close;

  Stud_Table.Open;

Для работы с параметрическими запросами компонентов TSimpleDataset необходимо в инспекторе объектов дважды щелкнуть справа от  их свойства Params и добавить как минимум необходимые имена параметров и значения по умолчанию. Свойство Params следует менять именно у компонента TSimpleDataset (не переходя по ветви дерева на ветку DataSet->Params!!!).

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

Stud_Table.Close;

Stud_Table.DataSet.CommandText:='Select * from student where gruppa='+   chr($27) + SDIAppForm.Group_select.Text+ chr($27)+';';

Stud_Table.Open;

В этом случае SQL запрос каждый раз динамически создается «с нуля», а затем запускается на выполнение. Обратите внимание на точки с запятой в конце строк и функцию chr($27) она возвращает символ одиночной кавычки (апострофа), иным способом добавить который к данному SQL запросу довольно путано. 

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

Dataset.commandType            ctQuery

Dataset.commandText            Select * from uspevaemost where st_bilet=:st_bilet;

перепишем обработчик события AfterScroll объекта Stud_Table таким образом чтобы он отрывал Usp_Table как параметрический запрос:

Похожие материалы

Информация о работе