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

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

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

Добавлен: 12.04.2021

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

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

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

!

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"); 


background image

!

!

П

ра
кт

ич

ес

ко

е

за

ня

ти

е

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%, 

чем

запросы

с

параметрами

но

легче

в

отладке

  – 

всегда

можно

просмотреть

лог

-

файл

ядра

и

понять

в

чем

ошибка


background image

!

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 


background image

!

!

П

ра
кт

ич

ес

ко

е

за

ня

ти

е

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 */ 


background image

!

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) 

  {