ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.04.2021
Просмотров: 1874
Скачиваний: 3

!
66
П
ра
кт
ич
ес
ко
е
за
ня
ти
е
11.
Ос
но
вн
ые
пр
ие
м
ы
ис
по
ль
зо
ва
ни
я
Li
n
A
PI
!
!
E-
mai
l:
ma
rke
t@
rele
x.r
u
if (lRet = LINTER_GetCursorOption(nCurs,
cSelectRowCount, 0, &recCount, &realLen))
processing_error(lRet, 0, nCurs, 0,"Error
GetCursorOption");
if (recCount)
{
printf("Was found %d students.\n", recCount);
for (i = 0; i < recCount; i++)
{
if (lRet = LINTER_Fetch(nCurs, toAbsNumber, i + 1,
1, 0, 0, 0))
processing_error(lRet, 0, nCurs, 0,"Error
Fetch");
if (lRet = LINTER_GetData(nCurs, 2, szMask,
MAXSTRLEN, tString, 0, 0, &realLen))
processing_error(lRet, 0, nCurs, 0,"Error
GetData");
printf("%d. %s\n", i + 1, szMask);
}
} else
{
printf("No students found.\n");
}
printf("Next search? (Y/N)\n");
gets(szMask);
}
printf("Cursor closing\n");
if (lRet = LINTER_CloseCursor(nCurs))
processing_error(lRet, 0, nCurs, 0,"Error CloseCursor");

!
!
П
ра
кт
ич
ес
ко
е
за
ня
ти
е
11.
Ос
но
вн
ые
пр
ие
м
ы
ис
по
ль
зо
ва
ни
я
Li
n
A
PI
!
67
E-
mai
l:
ma
rke
t@
rele
x.r
u
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 */
}
Скомпилируем
этот
файл
:
gcc prac12_e2.c -I /export/home/lindesk/linter5923/linter/
intlib/ -llinapi -lsocket -lm -L /export/home/lindesk/
linter5923/linter/intlib/ -o prac12_e2
Задача
2.
(
Студенты
выполняют
самостоятельно
)
Модифицировать
второй
пример
таким
образом
,
чтобы
пользователь
мог
задавать
диапазон
курсов
,
групп
и
фамилий
студентов
.
Задача
3.
(
Студенты
выполняют
самостоятельно
)
Модифицировать
второй
пример
таким
образом
,
чтобы
выводились
только
5
записей
,
и
пользователь
осуществлял
навигацию
по
выборке
(
следующие
5,
предыдущие
5).
Задача
4.
(
Студенты
выполняют
самостоятельно
)
Модифицировать
второй
пример
таким
образом
,
чтобы
выводились
только
5
записей
,
и
пользователь
осуществлял
навигацию
по
выборке
(
на
одну
запись
ниже
,
на
одну
запись
выше
).
11.4.
Получение
данных
при
помощи
Fetch
Рассмотрим
задачу
:
пусть
требуется
из
таблицы
со
студентами
создать
таблицу
со
статистикой
:
сколько
человек
обучается
на
каждом
курсе
.
Данную
задачу
можно
решить
средствами
SQL,
но
для
иллюстрации
работы
функции
LINTER_Fetch
будем
использовать
следующий
алгоритм
:
•
соединяемся
с
базой
данных
;
•
создаем
курсор
;
•
создаем
требуемую
таблицу
,
если
она
существует
,
то
удаляем
ее
;
•
из
данных
таблицы
накапливаем
количество
человек
на
каждом
курсе
;
•
вставляем
новые
данные
в
новую
таблицу
.
Следует
обратить
внимание
,
что
получение
данных
осуществляется
не
подачей
команды
GetData,
а
автоматически
при
каждом
смещении
по
выборке
командой
Fetch.
Вставка
данных
осуществляется
при
помощи
динамически
формируемых
запросов
.
Они
работают
медленней
на
10-15%,
чем
запросы
с
параметрами
,
но
легче
в
отладке
–
всегда
можно
просмотреть
лог
-
файл
ядра
и
понять
,
в
чем
ошибка
.

!
68
П
ра
кт
ич
ес
ко
е
за
ня
ти
е
11.
Ос
но
вн
ые
пр
ие
м
ы
ис
по
ль
зо
ва
ни
я
Li
n
A
PI
!
!
E-
mai
l:
ma
rke
t@
rele
x.r
u
Ниже
представлен
листинг
программы
из
файла
prac12_e3.c.
#include <stdio.h>
#include <stdlib.h>
#include "linapi.h"
#if defined(VXWORKS) /* 05.03.02 */
#include "vxstart.h"
#endif
#ifdef _BCPP_
extern unsigned _stklen = 16383;
#endif
/* function for error processing for LinAPI */
void processing_error(LONG ret_cod,
WORD con_id,
WORD cur_id,
WORD stmt_id,
char * message)
{
LONG lRet;
LONG apierr = 0, error = 0, syserr = 0;
if ( ret_cod == LINAPI_ERROR )
{
/* getting error codes for required object */
if (lRet = LINTER_Error(con_id, cur_id, stmt_id,
&apierr, &error, &syserr, NULL, NULL))
printf("diagnostic error %ld\n",lRet);
else

!
!
П
ра
кт
ич
ес
ко
е
за
ня
ти
е
11.
Ос
но
вн
ые
пр
ие
м
ы
ис
по
ль
зо
ва
ни
я
Li
n
A
PI
!
69
E-
mai
l:
ma
rke
t@
rele
x.r
u
{
printf("ApiErr = %ld, LinErr = %ld, SysErr = %ld\n%s
\n",
apierr, error, syserr, message);
if ( (apierr == eLinterError) && error > 2000 && error
< 3000)
{
/* getting string and position if syntax error is */
printf("Syntax error : line %d, position %d\n",
(short)syserr, *(short*)((char*)&syserr +2));
}
}
LINTER_CloseAPI(); /* Free library resource */
exit(1);
}
else
printf("Return code = %ld\n",ret_cod);
}
#define MAXSTRLEN 100
#define MAXKURSNUM 6
#if defined(VXWORKS) /* 05.03.02 */
MainStart(apidata, 32*1024, UninitLinterClient)
#else
int main(void)
#endif
{
WORD nConn; /* connection identifier */
WORD nCurs; /* cursor identifier */
LONG lRet; /* return code */

!
70
П
ра
кт
ич
ес
ко
е
за
ня
ти
е
11.
Ос
но
вн
ые
пр
ие
м
ы
ис
по
ль
зо
ва
ни
я
Li
n
A
PI
!
!
E-
mai
l:
ma
rke
t@
rele
x.r
u
LONG i = 0;
LONG realLen = 0;
LONG nKurs = 0;
LONG recCount = 0;
LONG statistic[MAXKURSNUM] = {0};
char szSQL[MAXSTRLEN * 10] = {0};
printf("\nConnect\n");
if (lRet = LINTER_Connect("SYSTEM", 0, "MANAGER", 0,
NULL, mAutocommit, &nConn))
processing_error(lRet, nConn, 0, 0, "ERROR
Linter_Connect");
printf("Open cursor\n");
if (lRet = LINTER_OpenCursor(nConn, &nCurs, NULL, 0,
mAutocommit))
processing_error(lRet, nConn, 0, 0, "Error open
cursor");
if (lRet = LINTER_ExecuteDirect(nCurs, "select * from
PRAC12_STUDENT;", 0, NULL,NULL))
processing_error(lRet, 0, nCurs, 0,"Error
ExecuteDirect");
realLen = sizeof(recCount);
if (lRet = LINTER_GetCursorOption(nCurs, cSelectRowCount,
0, &recCount, &realLen))
processing_error(lRet, 0, nCurs, 0,"Error
GetCursorOption");
if (recCount)
{