Дать группу записей выборки данных
Назначение
Команда
GETM
возвращает записи выборки данных в виде порции из заданного
количества записей.
Параметры вызова
inter(CBL, VarBuf, NULL, [CondBuf], RowBuf);
Входные данные
Входными данными является контрольный блок
CBL.
В нем должны быть заполнены поля:
| Имя поля | Значение | |
|---|---|---|
NumChan
| Номер канала | |
Command
|
"GETM"
| |
RowCount
| Количество требуемых записей | |
RowId
| Начальный номер требуемой порции записей | |
LnBufRow
| Длина буфера выборки данных | |
Node
| Имя ЛИНТЕР-сервера |
Примечания
-
Если RowId=0, то первой записью в порции будет следующая запись после текущей записи выборки.
-
Если RowCount=0, то в порции будет возвращено максимально возможное количество записей.
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL; -
буфер выборки данных
RowBuf; -
буфер параметров
VarBuf.
В контрольном блоке будут возвращены:
| Имя поля | Значение | |
|---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
RowId
| Системный номер последней записи в полученном пакете данных | |
LnBufRow
| Фактическая длина буфера выборки данных | |
RowCount
| Реальное число выбранных записей | |
SysErr
| Код состояния ОС |
Буфер выборки данных
RowBuf будет содержать порцию записей выборки данных.
В буфере
VarBuf возвращается
маска NULL-значений.
Описание
После выполнения
GETM
в буфер
RowBuf
считывается
очередная порция записей выборки данных,
курсор позиционируется на последней выбранной по
GETM
записи.
Количество записей, выбираемых в данной порции, ограничивается
количеством данных в выборке,
размером буфера для сохранения порции
LnBufRow, количеством запрашиваемых
данных
RowCount
(если != 0) и максимальным размером данных, передаваемых
интерфейсом (64 Kбайт минус накладные расходы). Реальное число
выбранных записей возвращается в поле
RowCount.
Коды завершения
| Код | Описание | |
|---|---|---|
| NORMAL | Нормальное завершение | |
| SMALLBUFKOR | Недостаточный размер буфера выборки данных | |
| EORR | Искомые данные не найдены (выборка данных пуста, или задан неправильный номер начальной записи) | |
| ERRSEQCOM |
Неправильная последовательность команд (команда
GETM
подана вне контекста SELECT-запроса)
|
Пример формирования команды
#include <string.h>
#include <stdlib.h>
#include "inter.h"
L_LONG LinterGETM(TCBL *pCBL, L_LONG Start, L_LONG N,
void *RowBuf, L_WORD RowBufLen, void *NullBuf)
{
memcpy(pCBL->Command, "GETM", 4);
pCBL->LnBufRow=RowBufLen;
pCBL->RowId=Start; /* start record, if RowId=0 then next *record */
pCBL->RowCount=N; /* количество записей */
pCBL->PrzExe &= ~Q_ASYNC;
inter(pCBL, NullBuf, NULL, NULL, RowBuf);
return pCBL->CodErr;
}
Пример использования команд для работы с выборкой данных
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "inter.h"
#include "exlib.h"
#ifndef WINCE
int main()
#else
int exgetx()
#endif
{
struct TRowBuf
{
L_CHAR Name[20];
L_CHAR FirstName[15];
L_CHAR Sex;
};
typedef struct TRowBuf TRowBuf;
TCBL CBLconnect;
L_CHAR Name_Pass[]="SYSTEM/MANAGER8";
L_CHAR Node[]=" ";
L_WORD Priority=0;
L_LONG PrzExe=M_EXCLUSIVE | Q_ENCODE | M_BINARY;
L_LONG Err;
L_CHAR Query[]="select NAME,FIRSTNAM, SEX from PERSON;";
L_WORD i;
TRowBuf RowBuf;
#define M 5
TRowBuf MRowBuf[M];
memset(&CBLconnect,0,sizeof(TCBL));
Err=LinterOPEN(&CBLconnect,Name_Pass,Node, Priority,PrzExe);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("Connect to RDBMS Linter\n");
Err =LinterSLCT(&CBLconnect,PrzExe,Query,&RowBuf, sizeof(TRowBuf), NULL);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("Select\n");
Err=LinterGETF(&CBLconnect, &RowBuf, sizeof(TRowBuf), NULL);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("GETF:\n");
printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex);
Err=LinterGETN(&CBLconnect, &RowBuf, sizeof(TRowBuf), NULL);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("GETN:\n");
printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex);
Err=LinterGETL(&CBLconnect, &RowBuf, sizeof(TRowBuf), NULL);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("GETL:\n");
printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex);
Err=LinterGETS(&CBLconnect, 5, &RowBuf, sizeof(TRowBuf), NULL);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("GETS:\n");
printf("%.20s %.15s %c\n\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex);
Err =LinterGETM(&CBLconnect,1,M,&MRowBuf, sizeof(TRowBuf)*M, NULL);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("GETM:\n");
for (i=0; i < M; i++)
printf("%.20s %.15s %c\n",
MRowBuf[i].Name,
MRowBuf[i].FirstName,
MRowBuf[i].Sex);
printf("\n");
printf("End Example\n");
return 0;
}