Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СУБД.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
6.32 Mб
Скачать

25.6.2 Базовые функции выборки данных

Как только закончена выборка информации о результирующем множестве, можно приступать к выборке собственно результирующего множества. В ODBC существует две функции базового уровня для выборки результатов: SQLBindCol() и SQLFetch(). Функция SQLBindCol() определяет область хранения данных результирующего множества, а SQLFetch() осуществляет выборку данных в области хранения. Алгоритм программы, использующей эти функции для возвращения данных из всех строк результирующего множества, предполагает выполнение следующих шагов:

1. Вызов SQLBindCol() один раз для каждого столбца, который должен быть возвращен из результирующего множества,

2. Вызов SQLFetch() для перемещения курсора на следующую строку и возврата данных из связанных столбцов,

3. Повторение шага 2 до тех пор пока SQLFetch() не возвратит SQL_NO_DATA_FOUND. Это указывает на то, что был достигнут конец результирующего множества. Если результирующее множество является пустым, то SQL_NO_DATA_FOUND будет возвращен сразу же при первом вызове SQLFetch().

Функция SQLFetch() извлекает строку данных из результирующего множества для выполненного SQL – оператора. Драйвер возвращает данные для всех столбцов, которые были связаны для предварительного хранения данных с помощью функции SQLBindCol(). Синтаксис функции SQLFetch():

RETCODE SQLFetch (hstmt)

Здесь HSTMT – идентификатор выполненного оператора.

Если необходимо определить область хранения данных результирующего множества, которые должны быть извлечены, то вызывается функция SQLBindCol(). Каждый столбец, который требуется выбрать, связывается с помощью отдельного вызова функции.

Функция SQLBindCol() назначает область хранения в памяти и тип данных для столбца результирующего множества. Она определяет:

• Буфер хранения для получения содержимого столбца данных в результирующем множестве,

• Длину указанного буфера хранения,

• Область памяти для хранения длины столбца выборки

• Преобразование типа данных.

Синтаксис данной функции имеет следующий вид:

RETCODE SQLBindCol (hstmt, icol, fcType, rgbValue, cbValueMax,

pcbValue)

Таблица 34 Параметры функции SQLBindCol()

Тип

Аргумент

Использование

Описание

1

2

3

4

HSTMT

hstmt

Вход

Идентификатор оператора

UWORD

icol

Вход

Номер столбца

результирующего множества, упорядоченный слева направо, начиная с 1

SWORD

fcType

Вход

С – тип данных столбца результирующего множества. Некоторые из возможных значений:

SQL_C_BINARY,

SQL_C_BIT,

SQL_C_CHAR,

SQL_C_DEFAULT,

SQL_C_FLOAT,

SQL_C_SLONG,

SQL_C_SSHORT,

SQL_C_ULONG,

SQL_C_USHORT.

SQL_C_DEFAULT определяет, что данные должны быть переданы в С – тип по умолчанию.

PTR

rgbValue

Вход

Указатель области хранения данных. Если является нулевым указателем, то драйвер “отвязывает” столбец. Для “отвязывания” всех столбцов программа вызывает SQLFreeStmt() с опцией SQL_UNBIND.

SDWORD

cbValueMax

Вход

Максимальная длина буфера rgbValue. Для символьных данных буфер должен предусматривать место для нуль – окончания строки.

Продолжение таблицы 34

1

2

3

4

SDWORD*

pcbValue

Вход

SQL_NULL_DATA или размер возвращаемой в rgbValue строки. Если размер строки не может быть определен, то по адресу pcbValue размещается SQL_NO_TOTAL.

SDWORD*

pcbValue

Вход

Если размер строки не может быть определен, или больше cbValueMax, то данные в rgbValue усекаются до размера, определенного в cbValueMax и имеют нулевое окончание, благодаря драйверу.

Для двоичных данных выполняется то же самое с поправкой на нуль – окончание. Для всех других типов данных значение cbValueMax игнорируется и драйвер считает, что размер rgbValue равен размеру С – типа данных, определенного в fcType.

Приведем пример программы, использующей средства ODBC:

#include <sql.h>

#include <stdio.h>

#include <stdlib.h>

#define MAX_STMT_LEN 100

main()

{

HENV henv; /*идентификатор среды*/

HDBC hdbc; /*идентификатор соединения*/

HSTMT hstmt; /*идентификатор оператора*/

RETCODE rc; /*код возврата*/

UCHAR selstmt [MAX_STMT_LEN] /*строка оператора*/

UCHAR address [30];

UCHAR tel_no [15];

UCHAR pos [25];

SDWORD address_len, tel_no_len, pos_len;

SQLAllocEnv (&henv);

SQLAllocConnect (henv, &hdbc);

rc=SQLConnect (hdbc, “drhome”, SQL_NTS, “student”, SQL_NTS, “student”,

SQL_NTS);

if (rc = = SQL_SUCCESS || rc = = SQL_SUCCESS_WITH_INFO)

{

SQLAllocStmt (hdbc,&hstmt);

lstrcpy (selstmt, “select address, tel_no, position from staff

where lname = ‘Иванов’ and fname = ‘Иван’ ”);

if (SQLExecDirect (hstmt, selstmt, SQL_NTS) != SQL_SUCCESS)

exit (-1);

SQLBindCol (hstmt, 1, SQL_C_CHAR, address,

(SDWORD)sizeof(address), address_len);

SQLBindCol (hstmt, 2, SQL_C_CHAR, tel_no,

(SDWORD)sizeof(tel_no), tel_no_len);

SQLBindCol (hstmt, 3, SQL_C_CHAR, pos,

(SDWORD)sizeof(pos), pos_len);

while(RETCODE_IS_SUCCESSFULL(rc))

{

rc=SQLFetch (hstmt);

if (RETCODE_IS_SUCCESSFULL(rc))

{

/*…вывод возвращенных строк…*/

}

}

SQLFreeStmt (hstmt, SQL_DROP);

SQLDisconnect (hdbc);

}

SQLFreeConnect (hdbc);

SQLFreeEnv(henv);

}