Лабораторная работа 8

ВЫБОРКА ДАННЫХ С ИСПОЛЬЗОВАНИЕМ СРЕДСТВ ODBC

Цель работы

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

Содержание работы и методические указания к ее выполнению

Для выполнения работы необходимо

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

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

Алгоритм программы, использующей SQLFetch() и SQLBindCol() для возвращения данных из результирующего множества предполагает выполнения следующих шагов:

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

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

HSTMT stmt - идентификатор оператора;

UWORD icol - идентификатор окружения;

SWORD fCtype - С-тип данных результирующего множества;

PTR rgbValue - указатель области хранения данных. Если rgbValue является нулевым указателем, то драйвер "отвязывает" столбец; для отвязывания всех столбцов прикладная программа вызывает SQLFreeStmt() с опцией SQL_UNBIND;

SDWORD cbValueMax - максимальная длина буфера rgbValue; для символьных данных, rgbValue должен также включать в себя место для байта нулевого окончания;

SDWORD pcbValue - число байт, которое может возвращаться в rgbValue при вызове SQLFetch().

Как только все требуемые столбцы были связаны, вызывается SQLFetch для выборки данных в определенной области хранения.

RETCODE SQLFetch (hstmt)

HSTMT stmt - идентификатор оператора.

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

Алгоритм программы, использующей SQLFetch() и SQLGetData() для извлечения данных из каждой строки результирующего множества предполагает выполнения следующих шагов:

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

RETCODE SQLGetData (hstmt, icol, fcType, rgbValue,

cbValueMax, pcbValue);

HSTMT stmt; - идентификатор оператора;

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

SWORD fCtype; - С-тип данных результирующего множества;

PTR rgbValue; - указатель области хранения данных. Если rgbValue является нулевым указателем, то драйвер "отвязывает" столбец. Для отвязывания всех столбцов прикладная программа вызывает функцию SQLFreeStmt() с опцией SQL_UNBIND.

SDWORD cbValueMax; - максимальная длина буфера rgbValue; для символьных данных, rgbValue должен также включать в себя место для байта нулевого окончания.

SDWORD FAR* pcbValue; - число байт, которое может возвращаться в rgbValue при вызове SQLGetData().

Замечание. Прикладная программа может использовать SQLBindCol() для некоторых столбцов, а SQLGetData() - для других столбцов в пределах той же самой строки.

Последовательность выполнения лабораторной работы

  1. Убедиться в наличии и заполненности базы данных поставщиков, деталей, изделий, поставок.
  2. Разработать ODBC-программу для решения задачи из соответствующего варианта с помощью функций SQLBindCol(), SQLFetch().
  3. Разработать ODBC-программу для решения задачи из соответствующего варианта с помощью функций SQLFetch(), SQLGetData().
  4. После выполнения лабораторной работы привести базу данных в исходное состояние.

Требования к разрабатываемой программе

Разрабатываемая программа должна удовлетворять следующим требованиям:

Варианты заданий

  1. Вывести информацию о поставщиках, поставивших детали для изделий из указанного города.
  2. Вывести информацию о деталях, поставки которых были осуществлены для указанного изделия.
  3. Вывести информацию о поставщиках, которые осуществляли поставки деталей из заданного города в указанный период.
  4. Вывести информацию о поставщиках, поставивших указанную деталь в заданный период.
  5. Вывести информацию обо всех деталях, поставляемых для указанного изделия более чем одним поставщиком.
  6. Вывести информацию о деталях, поставки которых были осуществлены для указанного изделия всеми поставщиками.
  7. Вывести информацию об изделиях, для которых была поставлена указанная деталь.
  8. Вывести информацию о поставщиках, которые осуществляли поставки деталей для указанного изделия.

Контрольные вопросы

  1. Какие существуют базовые функции выборки данных? Охарактеризуйте каждую из них.
  2. Как "отвязать" отдельный столбец результирующего множества?
  3. Каким образом можно "отвязать" все столбцы результирующего множества?
  4. Что возвращает функция SQLFetch, если в результирующем множестве больше не осталось данных?
  5. Как определить область хранения данных?
  6. Каков алгоритм выборки данных с помощью курсора?
  7. Как работает функция SQLFetch?
  8. Можно ли использовать SQLFetch для продвижения курсора в обратном направлении?