Поиск и выборка данных
Назначение
Команда
SLCT
позволяет приложению послать к СУБД поисковый запрос и получить в
ответ найденную в БД информацию.
Параметры вызова
inter(CBL, VarBuf, OpBuf, [CondBuf], RowBuf);
Входные данные
Входными данными являются:
-
контрольный блок
CBL; -
буфер оператора
OpBuf.
В контрольном блоке должны быть заполнены поля:
| Имя поля | Значение | |
|---|---|---|
NumChan
| Номер канала | |
Command
|
"SLCT"
| |
LnBufRow
| Длина буфера выборки данных | |
Node
| Имя ЛИНТЕР-сервера | |
PrzExe
| Режим обработки запроса |
Буфер оператора
OpBuf должен содержать текст SELECT-запроса.
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL; -
буфер выборки данных
RowBuf; -
буфер параметров
VarBuf.
В контрольном блоке будут возвращены:
| Имя поля | Значение | |
|---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
RowId
| Системный номер первой выбранной записи | |
RowCount
| Число найденных записей | |
LnBufRow
| Фактическая длина выбранной записи выборки данных | |
SysErr
| Код состояния ОС |
Примечание
Значение поля
RowId
однозначно определяет системный номер выбранной записи только в
случае выборки из одной таблицы.
В случае запроса, который выбирает записи из нескольких множеств,
значение
RowId
неоднозначно и будет установлено в 0.
Буфер выборки данных
RowBuf будет содержать первую запись выборки данных.
В буфере
VarBuf возвращается маска NULL-значений, представленная в следующем виде:
L_WORD K1; /* Количество записей в порции выборки данных */
L_WORD K2; /* Количество полей в записи выборки данных */
L_BYTE [K1*K2]; /* По одному байту на каждое поле */
/* записи выборки данных */
/* Нулевое значение байта соответствует определенному */
/* значению поля, значение 1 – неопределенному (NULL-значение) */
Описание
При обработке SELECT-запроса СУБД ЛИНТЕР полностью выбирает из БД все найденные записи, однако в приложение передается только первая найденная запись. Дальнейшая работа с записями осуществляется с помощью команд:
-
GETA – дать информацию о структуре записи выборки данных;
-
GETF – дать первую запись выборки данных;
-
GETL – дать последнюю запись выборки данных;
-
GETN – дать следующую запись выборки данных;
-
GETP – дать предыдущую запись выборки данных;
-
GETS – дать указанную запись выборки данных;
-
GETM – дать несколько записей за одно обращение.
Примечание
СУБД ЛИНТЕР
«не знает»
реальной границы программных буферов приложения и при размещении
записи в буфере выборки данных
руководствуется только полученным значением
LnBufRow.
Поэтому, если заданное значение
LnBufRow
больше фактической длины буфера выборки данных, то часть записи
может быть размещена за пределами буфера выборки данных, запортив
при этом данные и/или программный код приложения.
| Код | Описание | |
|---|---|---|
| NORMAL | Нормальное завершение | |
| SMALLBUFKOR | Недостаточный размер буфера выборки данных | |
| EORR | Искомые данные не найдены | |
| Целочисленное значение | Коды завершения, вызванные синтаксическими или семантическими ошибками поданного SELECT-запроса (см. документ «Справочник кодов завершения», раздел «Коды завершения выборки данных (1-3)») |
Пример формирования команды
#include <string.h>
#include <stdlib.h>
#include "inter.h"
L_LONG LinterSLCT(TCBL * pCBL, L_LONG PrzExe, L_CHAR * Statement, void *RowBuf, L_WORD RowBufLen, void *NullBuf)
{
memcpy(pCBL->Command, "SLCT", 4);
pCBL->PrzExe = PrzExe;
pCBL->LnBufRow = RowBufLen;
pCBL->PrzExe &= ~Q_ASYNC;
inter(pCBL, NullBuf, Statement, 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 exslct()
#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;";
TRowBuf RowBuf;
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("First Selected Row:\n");
printf("%.20s %.15s %c\n", RowBuf.Name, RowBuf.FirstName, RowBuf.Sex);
printf("End Example\n");
return 0;
}