Поиск и выборка данных
Назначение
Команда
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; }