35142

Программная реализация выборки и модификации данных в базе данных Interbase

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

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

При этом сохранение результатов редактирования выполняется путем вызова рассмотренной ранее функции pplyUpdtes класса TBDEDtSet и всех его потомков например компонента Query содержимое выборки которого редактируется и кэшируется которая выполняет отправку в БД закэшированных на клиентской стороне изменений. Пример реализации функции обработки события OnUpdteRecord: void __fstcll TDtModule1::Query1UpdteRecordTDtSet DtSet TUpdteKind UpdteKind TUpdtection Updtection { switch UpdteKind { cse ukModify: brek; cse ukInsert:...

Русский

2013-09-09

56.5 KB

2 чел.

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

Программная реализация выборки и модификации данных в базе данных Interbase

Borland C++Builder 6 предоставляет несколько наборов компонентов для реализации доступа к БД. Рассмотрим базовый набор BDE.

Набор компонентов BDE размещен на закладке BDE палитры компонентов.

Для установления соединения с БД используется объект класса TDatabase. Он должен быть размещен в контейнере DataModule. При этом первоначально в BDE Administrator или в SQL Explorer должен быть создан псевдоним (alias) БД. Компонент TDatabase может подключиться по имени БД, указанному путем, только к БД форматов dBase и Paradox. Для прочих БД (в частности, Interbase) необходимо указывать псевдоним, предварительно созданный в административных средствах BDE.

Создание псевдонима выполняется в BDE Administrator или в SQL Explorer в дереве БД, представленном на закладке Databases. Для создания псевдонима используется функция “New…”, вызываемая из контекстного меню корня дерева Databases. При создании выбирается имя драйвера БД – “INTRBASE”. Для созданного псевдонима настраивается путь и имя файла в свойстве “SERVER NAME”, а также имя административного пользователя “SYSDBA” в свойстве “USER NAME”.

После того, как псевдоним создан, может быть организовано подключение к БД в разрабатываемом проекте. Для этого у компонента Database настраивается свойство AliasName, а также вводится произвольное имя DatabaseName. При попытке установки в значение “true” свойства Connected будет выдан диалог ввода имени пользователя и пароля. Вводятся имя и пароль администратора “SYSDBA” – “masterkey”. Ввод имени и пароля будет выполняться каждый раз при подключении БД, в частности, каждый раз при запуске программы. Если есть необходимость скрыть ввод имени и пароля от пользователя, то они могут быть введены как параметры в свойстве Params объекта Database:

USER NAME=SYSDBA

PASSWORD=masterkey

Обратите внимание, что, несмотря на установку параметров, запрос пароля производится будет. Для того, чтобы вообще исключить вывод окна запроса, сбрасывается значение свойства LoginPrompt объекта Database.

Для доступа к объектам БД используются изученные в предыдущих работах компоненты TTable и TQuery. В свойстве DatabaseName компонента Table вводится имя БД, которое было указано в свойстве DatabaseName компонента Database. В результате, если компонент Database был предварительно подключен к БД, в свойстве TableName компонента Table предоставляются на выбор имена таблиц, входящих в эту базу данных. При корректной настройке можно выбрать имя таблицы и установить свойство Active объекта Table. Если свойство успешно установлено, значит, таблица открыта. Теперь можно известными методами организовать подключение компонентов DataSource и DBGrid для визуализации таблицы на форме. Не забудьте включить в модуль формы при помощи директивы #include заголовочный файл модуля данных. Тогда настройка подключения невизуальных компонентов к визуальным будет производится естественно.

Аналогично к компоненту Database подключается компонент Query.

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

Результаты селектирующего запроса, выполняемого при помощи компонента Query, могут быть выведены в DBGrid. При этом в общем случае результаты запроса являются нередактируемыми. Выборку можно сделать редактируемой путем установки свойства RequestLive компонента Query. Причем установка этого свойства означает лишь попытку сделать выборку редактируемой, которая может и завершиться неудачей. При этом генерируется исключение, которое может быть перехвачено, а проверка того, является ли выборка редактируемой осуществляется при помощи свойства CanModify. Результат указанной попытки зависит от того, насколько данная функциональность поддерживается используемым SQL-сервером. В большинстве случаев редактируемыми можно сделать только запросы, возвращающие данные из одной таблицы.

Сделать редактируемыми выборки из нескольких таблиц можно путем использования кэшированных изменений (установка флага CachedUpdates) и события OnUpdateRecord. При этом Query «считает», что разработчик описал необходимую алгоритмику обработки результатов пользовательского редактирования. В результате выборка становится редактируемой.

При этом сохранение результатов редактирования выполняется путем вызова рассмотренной ранее функции ApplyUpdates класса TBDEDataSet и всех его потомков (например, компонента Query, содержимое выборки которого редактируется и кэшируется), которая выполняет отправку в БД закэшированных на клиентской стороне изменений. Функция ApplyUpdates может быть вызвана по завершению работы с программой или по директивному указателю пользователя. В процессе выполнения ApplyUpdates вызывается обработчик OnUpdateRecord. Пример реализации функции обработки события OnUpdateRecord:

void __fastcall TDataModule1::Query1UpdateRecord(TDataSet *DataSet,

 TUpdateKind UpdateKind, TUpdateAction &UpdateAction)

{

switch (UpdateKind)

{

 case ukModify: break;

 case ukInsert:

  ExecQuery->SQL->Text = "INSERT INTO people "

   + "(id, name1, name2, name3) VALUES ("

   + IntToStr(DataSet->FieldByName("ID")->AsInteger) + ", \'"

   + DataSet->FieldByName("NAME1")->AsString + "\', \'"

   + DataSet->FieldByName("NAME2")->AsString + "\', \'"

   + DataSet->FieldByName("NAME3")->AsString + "\');";

  ExecQuery->ExecSQL();

  ExecQuery->SQL->Text = "INSERT INTO job_dict "

   + "(id, name) VALUES ("

   +IntToStr(DataSet->FieldByName("ID_2")->AsInteger)+", \'"

   + DataSet->FieldByName("NAME")->AsString + "\');";

  ExecQuery->ExecSQL();

  ExecQuery->SQL->Text = "INSERT INTO jobs "

   + "(id, p_id, j_id, bdate, edate) VALUES ("

   + DataSet->FieldByName("ID_1")->AsString + ", "

   + DataSet->FieldByName("P_ID")->AsString + ", "

   + DataSet->FieldByName("J_ID")->AsString + ", \'"

   + DataSet->FieldByName("BDATE")->AsDateTime + "\', \'"

   + DataSet->FieldByName("EDATE")->AsDateTime + "\')";

  ExecQuery->ExecSQL();

  break;

 case ukDelete: break;

};

}

//---------------------------------------------------------------------------

DataSet – это тот набор данных, для которого вызывается функция применения обновлений. UpdateKind – тип обновления (модификация, вставка, удаление). Параметр UpdateAction должен устанавливаться в значение uaApplied в случае корректного завершения работы обработчика. В противном случае он останется в значении uaFail, которое передает обработчику вызывающая функция.

В данном примере выводимый набор данных представляет собой выборку из трех соединенных таблиц, в результате чего изменение каждой записи набора данных должно отражаться в трех таблицах. В данном случае используется компонент ExecQuery класса TQuery, выполняющий чисто экзекутивные функции, т.е. предназначенный для запуска запросов на обновление, а не на выборку. Трижды запускается его метод ExecSQL для выполнения обновления в трех таблицах. При этом в запросы типа INSERT подставляются значения из текущей записи набора данных DataSet, адресуемые именами полей при помощи функции FieldByName. Можно значения полей не «подхватывать на лету», используя имена полей, а заранее в конструкторе создать набор объектов, связанных с полями набора данных (Fields Editor… в контекстном меню компонента типа «набор данных», в частности, TTable, TQuery и т.д.). При этом можно будет обращаться к этим полям, которые всегда будут содержать значения полей актуальной записи и, кроме того, будут типизированы, т.е. можно будет сразу получать их значение (свойство Value), а не обращаться к свойствам типа AsXXX, как в приведенном примере.

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

А вот как можно реализовать ту же обработку вставки записи в набор данных при помощи параметризованных запросов:

ExecQuery->ParamByName("PID")->Value =

DataSet->FieldByName("ID")->AsInteger;

ExecQuery->ParamByName("PNAME1")->Value =

DataSet->FieldByName("NAME1")->AsString;

ExecQuery->ParamByName("PNAME2")->Value =

DataSet->FieldByName("NAME2")->AsString;

ExecQuery->ParamByName("PNAME3")->Value =

DataSet->FieldByName("NAME3")->AsString;

ExecQuery->ExecSQL();

ExecQuery1->ParamByName("PID")->Value =

DataSet->FieldByName("ID_2")->AsInteger;

ExecQuery1->ParamByName("PNAME")->Value =

DataSet->FieldByName("NAME")->AsString;

ExecQuery1->ExecSQL();

ExecQuery2->ParamByName("PID")->Value =

DataSet->FieldByName("ID_1")->AsInteger;

ExecQuery2->ParamByName("PPID")->Value =

DataSet->FieldByName("P_ID")->AsInteger;

ExecQuery2->ParamByName("PJID")->Value =

DataSet->FieldByName("J_ID")->AsInteger;

ExecQuery2->ParamByName("PBDATE")->Value =

DataSet->FieldByName("BDATE")->AsDateTime;

ExecQuery2->ParamByName("PEDATE")->Value =

DataSet->FieldByName("EDATE")->AsDateTime;

ExecQuery2->Prepare();

ExecQuery2->ExecSQL();

Те же самые значения, которые в предыдущем примере использовались для формирования текстов SQL-запросов сейчас просто передаются компоненту класса TQuery в виде параметров, адресуемых по имени. При этом вместо одного компонента TQuery, как в предыдущем примере, используется три отдельных компонента с заготовленными текстами параметризованных SQL-запросов. Например, запрос, содержащийся в свойстве SQL объекта ExecQuery. Представляет собой следующую строку:

INSERT INTO people (id, name1, name2, name3)

VALUES (:PID, :PNAME1, :PNAME2, :PNAME3);

Отсюда видно, что параметры в тексте параметризованного запроса обозначаются двоеточиями. После ввода такого текста запроса параметры становятся доступны в свойстве Params объекта TQuery. Там, в частности, может быть настроен тип каждого параметра.

В качестве завершающего этапа разработки отключите все имеющиеся подключения к БД в конструкторе (в среде разработки Borland C++Builder) и реализуйте установку подключений при создании модуля данных (событие OnCreate объекта DataModule).

В результате выполнения работы должна быть получена программа, работающая с БД Interbase и включающая в себя:

  1.  Отображение в таблице (DBGrid) результатов выполнения сложного запроса, выполняющего соединение таблиц.
  2.  Сохранение в БД изменений, внесенных в выборку, путем использования события OnUpdateRecord. Должно поддерживаться сохранение всех трех видов изменений: удаление, модификация, вставка. Должна быть реализована поддержка необходимой логики, например, удаление записи из главной таблицы только в случае отсутствия подчиненных записей.
  3.  Использование при сохранении изменений и формирования полных текстов запросов, и параметрических запросов.


 

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

14303. Основи музичної грамоти 1.41 MB
  ЛЕКЦІЙНИЙ МАТЕРІАЛ ДО ТЕМИ Основи музичної грамоти спеціальність 5.010102. Початкове навчання Викладач Громова Н.О. Музика це мистецтво звуків. В звукових художніх образах відображається оточуюча нас дійсність передаються відчуття настрої переживання людей...
14304. Электронный осциллограф. Исследование чувствительность пластин вертикального и горизонтального отклонений осциллографической трубки 37 KB
  Отчет по лабораторной работе №2 Тема: Электронный осциллограф Цель работы. Исследовать чувствительность пластин вертикального и горизонтального отклонений осциллографической трубки. Наблюдать с помощью осциллографа синусоидальное напряжение полученное с вых
14305. Исследование электромагнитных колебаний в параллельном RLC контуре 40 KB
  Отчет по лабораторной работе №3 Тема: Исследование электромагнитных колебаний в параллельном RLC контуре Задача Для параллельного LC колебательного контура измерить и вычислить следующие величины: В режиме свободных затухающих колебаний: период колебаний лог
14306. Экспериментальная проверка принципа эквивалентности масс 142 KB
  Отчёт по лабораторной работе №4 Тема: Экспериментальная проверка принципа эквивалентности масс Задача: 1. Проверка принципа эквивалентности масс. 2. Измерение ускорения свободного падения тел. 3. Знакомство с методом измерения длительности импульсов частот
14307. Измерение отношения заряда электрона к постоянной Больцмана 66.2 KB
  Отчет по лабораторной работе №7 Тема: Измерение отношения заряда электрона к постоянной Больцмана Задача Измерить зависимость тока короткого замыкания коллектора транзистора от напряжения между эмиттером и базой. По результатам измерений определить отнош
14308. Измерение скорости звука в твёрдых телах 35 KB
  Отчет по лабораторной работе №9 Тема: Измерение скорости звука в твёрдых телах. Задача Измерить скорость распространения продольной волны сжатия в образце. Измерить скорость распространения сдвиговой волны в образце. Блоксхема экспериментальной уст...
14309. Исследование электрических процессов в переходных цепях. Явления дифференцирования и интегрирования 73.11 KB
  Отчет по лабораторной работе №10в Тема: Исследование электрических процессов в переходных цепях. Явления дифференцирования и интегрирования. Задача Исследовать электрические процессы в переходных цепях. Познакомиться с явлениями дифференцирования и интег
14310. Многократные прямые измерения физический величин и обработка результатов наблюдения 218 KB
  Отчет по лабораторной работе №1.а Тема: Многократные прямые измерения физический величин и обработка результатов наблюдения Задача Освоить методику использования измерительного прибора для многократного прямого измерения физической величины. Выполнить пр
14311. Многократные прямые измерения физических величин и обработка результатов наблюдения 225 KB
  Отчет по лабораторной работе №1.а Тема: Многократные прямые измерения физических величин и обработка результатов наблюдения Задача Освоить методику использования измерительного прибора для многократного прямого измерения физической величины. Выполнить п