ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.04.2021

Просмотров: 1872

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

!

76

П

ра
кт

ич

ес

ко

е

за

ня

ти

е

11. 

Ос

но

вн

ые

пр

ие

м

ы

ис

по

ль

зо

ва

ни

я

Li

n

A

PI

!

!

 
 

E-

mai

l: 

ma

rke

t@

rele

x.r

u

  if (lRet = LINTER_OpenCursor(nConn, &nCurs, NULL, 0, 
mExclusive)) 

   processing_error(lRet, nConn, 0, 0, "Error open 
cursor"); 

  printf("Students updating..."); 

  if (lRet = LINTER_ExecuteDirect(nCurs, "update 
PRAC12_STUDENT set SKURS = SKURS + 1;", 0, NULL,NULL)) 

    processing_error(lRet, 0, nCurs, 0,"Error 
ExecuteDirect"); 

  realLen = sizeof(recCount); 

  if (lRet = LINTER_GetCursorOption(nCurs, cRowCount, 0, 
&recCount, &realLen)) 

    processing_error(lRet, 0, nCurs, 0,"Error 
GetCursorOption"); 

  printf(" Done. %d records updated.\n", recCount); 

  printf("Students deleting..."); 

  if (lRet = LINTER_ExecuteDirect(nCurs, "delete from 
PRAC12_STUDENT where SKURS > 6;", 0, NULL,NULL)) 

    processing_error(lRet, 0, nCurs, 0,"Error 
ExecuteDirect"); 

  realLen = sizeof(recCount); 

  if (lRet = LINTER_GetCursorOption(nCurs, cRowCount, 0, 
&recCount, &realLen)) 

    processing_error(lRet, 0, nCurs, 0,"Error 
GetCursorOption"); 

  printf(" Done. %d records deleted.\n", recCount); 

  printf("Do you want to commit changes? (Y/N)\n"); 

  gets(szMask); 

   

  if (!strcmp(szMask, "Y") || !strcmp(szMask, "y")) 


background image

!

!

П

ра
кт

ич

ес

ко

е

за

ня

ти

е

11. 

Ос

но

вн

ые

пр

ие

м

ы

ис

по

ль

зо

ва

ни

я

Li

n

A

PI

!

77

 
 

E-

mai

l: 

ma

rke

t@

rele

x.r

u

  { 

    printf("Commit..."); 

    if (lRet = LINTER_ExecuteDirect(nCurs, "commit;", 0, 
NULL,NULL)) 

      processing_error(lRet, 0, nCurs, 0,"Error 
ExecuteDirect"); 

    printf("Done\n"); 

  } else 

  { 

    printf("Rollback..."); 

    if (lRet = LINTER_ExecuteDirect(nCurs, "rollback;", 0, 
NULL,NULL)) 

      processing_error(lRet, 0, nCurs, 0,"Error 
ExecuteDirect"); 

    printf("Done\n"); 

  } 

   

  printf("Cursor closing\n"); 

  if (lRet = LINTER_CloseCursor(nCurs)) 

   processing_error(lRet, 0, nCurs, 0,"Error CloseCursor"); 

  printf("Connection closing\n"); 

  if (lRet = LINTER_CloseConnect(nConn)) 

   processing_error(lRet, nConn, 0, 0, "ERROR 
CloseConnect"); 

  printf("LINTER_CloseAPI\n"); 

  LINTER_CloseAPI();      /* Free library resource */ 

  printf("Done.\n"); 

  return 0; 

 /* End */ 


background image

!

78

П

ра
кт

ич

ес

ко

е

за

ня

ти

е

11. 

Ос

но

вн

ые

пр

ие

м

ы

ис

по

ль

зо

ва

ни

я

Li

n

A

PI

!

!

 
 

E-

mai

l: 

ma

rke

t@

rele

x.r

u

Скомпилируем

этот

файл

gcc prac12_e4.c -I /export/home/lindesk/linter5923/linter/
intlib/ -llinapi -lsocket -lm -L /export/home/lindesk/
linter5923/linter/intlib/ -o prac12_e4

Задача

  6.

(

Студенты

выполняют

самостоятельно

)

Модифицировать

данный

пример

в

таблицу

студентов

добавляется

столбец

  SFORM  (

форма

обучения

  – 

бакалавр

специалист

или

магистр

). 

Модифицировать

процесс

удаления

студентов

из

таблицы

по

окончанию

вуза

учитывая

что

время

обучения

бакалавра

 – 4 

года

специалиста

 – 5 

лет

и

магистра

 – 6.  

Выпускников

заносить

в

таблицу

  PRAC12_VYPUSK  (

ФИО

номер

группы

год

выпуска

квалификация

). 


background image

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

занятие

 12

Пример

разработки

приложения

для

ЛИНТЕР

с

использованием

 Qt 

Практика

 8 

часов

Целью

данной

практики

является

освоение

техники

построения

графического

приложения

работающего

с

базой

данных

ЛИНТЕР

в

среде

  Unix, 

при

использовании

графической

библиотеки

 Qt 

версии

 1.4.x 

или

выше

 (

необходимы

общие

знания

по

 Qt). 

В

данном

практике

рассматривается

синхронная

и

асинхронная

работа

с

ЛИНТЕР

и

прием

сообщений

от

ЛИНТЕР

через

асинхронный

запрос

Работа

с

ЛИНТЕР

осуществляется

через

 Call-

интерфейс

 (

необходимы

знания

из

предыдущих

занятий

по

 Call-

интерфейсу

). 

Используются

вызовы

  Call-

интерфейса

уже

изученные

нами

и

никакой

особой

специфики

здесь

нет

Аналогичным

образом

можно

было

бы

использовать

и

 LinAPI. 

Специфичность

нашей

практики

заключается

в

использовании

классов

  C++, 

обеспечивающих

работу

с

ЛИНТЕР

в

частности

при

построении

приложений

с

графическим

интерфейсом

пользователя

на

основе

библиотеки

 Qt. 

В

примере

используется

таблица

 AUTO 

со

следующей

структурой

create table auto( 

  MAKE              char(20), 

  MODEL             char(20), 

  BODYTYPE          char(15), 

  CYLNDERS          integer, 

  HORSEPWR          integer, 

  DSPLCMNT          integer, 

  WEIGHT            integer, 

  COLOR             char(10), 

  YEAR              integer, 

  SERIALNO          char(16), 

  CHKDATE           integer, 

  CHKMILE           integer, 

  PERSONID          integer primary key); 

Эта

таблица

входит

в

демонстрационную

БД

СУБД

ЛИНТЕР

и

ее

всегда

можно

создать

и

загрузить

из

файлов

входящих

в

дистрибутив

ЛИНТЕР

Для

работы

примеров

в

базе

данных

после

ее

старта

должно

быть

создано

событие

 AUTO_CHANGE:  

create event auto_change as delete, update, insert on auto; 

Приложение

визуально

построено

так

что

данные

из

запроса

отображаются

в

многострочном

элементе

  (

это

либо

список

либо

таблица

и

для

текущей

строки

в

  4 

однострочных

элементах

 (

однострочный

редактор

).


background image

!

80

П

ра
кт

ич

ес

ко

е

за

ня

ти

е

12

П

ри
ме

р

ра

зр

аб
от

ки

пр
ил

ож

ен

ия

дл

я

Л

И
Н

Т
Е

Р

с

ис

по

ль

зо

ва

ни

ем

Qt

!

!

 
 

E-

mai

l: 

ma

rke

t@

rele

x.r

u

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

работа

разделена

на

три

этапа

на

каждом

из

которых

создается

готовое

   

графическое

приложение

.  

Сборка

приложения

осуществляется

с

помощью

команды

  'make' 

в

результате

выполнения

которой

создается

исполняемый

файл

  'main'. 

Перед

сборкой

должны

быть

изменены

значения

переменных

  LINTER 

и

  QTDIR 

на

те

которые

соответствуют

реальности

Исходные

файлы

и

сценарии

сборки

для

каждого

из

примеров

находятся

в

подкаталогах

 step1, step2, step3.

На

первом

этапе

демонстрируется

синхронная

работа

с

ЛИНТЕР

В

приложении

используется

многострочный

элемент

  - 

список

для

вывода

результата

выборки

и

  4 

однострочных

редактора

для

вывода

значений

полей

каждой

записи

После

запуска

программы

список

будет

заполнен

значениями

поля

 AUTO.SERIALNO, 

а

в

однострочных

редакторах

значениями

полей

 MAKE, MODEL,YEAR, SERIALNO 

текущей

записи

выборки

.

На

втором

этапе

добавляется

возможность

асинхронного

приема

сообщения

от

Линтера

и

его

синхронная

обработка

в

программе

Если

во

время

работы

программы

при

помощи

любой

клиентской

программы

изменить

содержимое

таблицы

  AUTO, 

то

ранее

запущенная

программа

сама

перечитает

данные

.

На

третьем

этапе

к

функциональности

реализованной

на

первых

этапах

добавляется

возможность

асинхронного

выполнения

  select-

запроса

Программа

не

ожидает

ответа

на

запрос

а

продолжает

работать

и

только

после

наступления

события

о

готовности

источника

данных

элементы

управления

заполняются

данными

Внешне

программа

не

отличается

от

предыдущих

только

вместо

списка

используется

таблица

для

отображения

результатов

выборки

Для

того

чтобы

была

видна

работа

программы

при

изменении

состояния

источника

данных

выводятся

информационные

окна

.  SQL-

запрос

к

Линтеру

написан

специально

с

перемножением

таблиц

чтобы

была

видна

пауза

между

началом

выполнения

запроса

и

его

концом

Далее

опишем

более

подробно

устройство

классов

и

принципы

по

которым

были

написаны

приложения

на

каждом

из

этапов

12.1. 

Первый

этап

В

прикладных

системах

часто

одни

и

те

же

данные

одновременно

отображаются

в

разных

визуальных

элементах

Поэтому

введем

отдельный

объект

для

работы

с

данными

 - 

источник

данных

Для

представления

данных

в

программе

разработаем

два

класса

:

CDataSource

  - 

интерфейсный

класс

источник

данных

реляционного

типа

Его

основные

особенности

он

осуществляет

технологию

работы

с

курсором

через

методы

    getCurRow  ,  

setCurRow, rowCount; 

он

может

находиться

в

двух

состояниях

активен

и

неактивен

метод

  state 

может

возвратить

 Empty/Ready; 

источник

данных

активизируется

методом

  retrieve, 

а

деактивизируется

методом

destroy 

или

при

возникновении

ошибки

табличные

значение

можно

получить

вызовом

методов

  

getNull, 
getField, 
getFieldAsChar  (

всегда

конвертирует

значение

в

строку

); 

источник

данных

имеет

 3 

сообщения

onError - 

генерируется

при

возникновении

ошибки

onFullChange - 

генерируется

при

изменении

текущего

состояния

,  

onCurRowChange - 

генерируется

при

изменении

текущей

строки

курсора

  

В

принципе

класс

источника

данных

должен

быть

абстрактным

 (

можно

разработать

различные

источники

данных

  - 

например

источник

данных

в

памяти

), 

но

мы

сразу

будем

делать

реализацию

настроенную

на

работу

с

 SQL-

запросами

используя

класс

 CSqlDS.

CSqlDS

 – 

класс

который

делегирует

свою

функциональность

по

работе

с

выборкой

по

 SQL-

запросу

Класс

имеет

одно

сообщение

 'onError'   (

в

принципе

можно

обойтись

и

без

него

,  

если

построить

контроль

ошибок

через

возвращаемый

результат

или

исключения

). 

В