ВЫПОЛНЕНИЕ ПРОСТЕЙШИХ SQL-ОПЕРАТОРОВ С ИСПОЛЬЗОВАНИЕМ СРЕДСТВ ODBC
Лабораторная работа 7
ВЫПОЛНЕНИЕ ПРОСТЕЙШИХ SQL-ОПЕРАТОРОВ С ИСПОЛЬЗОВАНИЕМ СРЕДСТВ ODBC.
Цель работы
Ознакомиться со структурой программ, использующие средства ODBC, реализовать и выполнить с использованием простейших функций ODBC запросы, связанные с модификацией таблиц.
Содержание работы и методические указания
к ее выполнению
Для выполнения работы необходимо
1. Структура ODBC-программы и функции инициализации
Общая структура ODBC-программы имеет вид:
RETCODE SQLAllocEnv (env)
HENV env - указатель области хранения в памяти идентификатора окружения.
RETCODE SQLFreeEnv (env)
HENV env - имя идентификатора окружения, который должен быть освобожден.
RETCODE SQLAllocConnect (env, dbc)
HENV env - указатель на идентификатор окружения прикладной программы.
HDBC dbc - указатель области хранения памяти для идентификатора соединения.
RETCODE SQLFreeConnect (dbc)
HDBC dbc - указатель области памяти для освобождаемого идентификатора соединения.
RETCODE SQLConnect(dbc, szDSN, sbDSN, szUID, sbUID, szAuthStr, cbAuthStr)
HDBC dbc - идентификатор соединения.
UCHAR szDSN - строка с именем источника данных, с которым прикладная программа собирается соединиться.
SWORD sbDSN - длина строки источника данных, если это имя имеет нулевое окончание, то этот параметр можно установить в SQL_NTS, который является константой ODBC и используется вместо длины параметра, если параметр содержит строку с нулевым окончанием.
UCHAR szUID - имя пользователя.
SWORD sbUID - длина имени пользователя или SQL_NTS.
UCHAR szAuthStr - пароль пользователя.
SWORD cbAuthStr - длина пароля.
RETCODE SQLDisconnect (dbc)
HDBC dbc - идентификатор доступа для отсоединения.
RETCODE SQLAllocStmt (dbc, stmt)
HDBC dbc - идентификатор соединения.
HSTMT stmt - указатель области хранения в памяти для идентификатора оператора.
RETCODE SQLFreeStmt (stmt, fOption)
HSTMT stmt -идентификатор оператора.
UWORD fOption - одна из следующих опций:
SQL_CLOSE - закрывает курсор, связанный с hstmt, (если он был определен) и отбрасывает все ожидаемые результаты. Прикладная программа может вновь открыть этот курсор позднее, вновь выполнить оператор SELECT с теми же самыми или другими значениями параметров. Если курсор не открыт, то эта опция не повлияет на программу.
SQL_DROP - освобождает hstmt, освобождает все ресурсы, связанные с ним, закрывает курсор, если он открыт, и отбрасывает все ожидаемые строки. Эта опция завершает все обращения к hstmt. hstmt обязательно должен быть переназначен для повторного использования. Эта опция освобождает все ресурсы, которые были определены с помощью функции SQLFreeStmt.
SQL_UNBIND - освобождает все буферы столбцов, которые повторно используются функцией SQLBindCol для данного идентификатора оператора.
SQL_RESET_PARAMS - освобождает все буферы параметров, которые были установлены функцией SQLBindCol для данного идентификатора оператора.
2. Средства отслеживания ошибок
Для отслеживания ошибок в ODBC используется функция SQLError, которая возвращает сообщение об ошибке при неудачном завершении какой-либо функции ODBC.
Каждая ODBC-функция возвращает RETCODE, который принимает одно из нижеследующих значений:
RETCODE SQLError (henv, hdbc, hsmt, szSqlState, pfNativeError, szErrorMsg, cbErrorMsgMax, cbErrorMsg)
HENV henv - идентификатор окружения.
HDBC hdbc - идентификатор соединения.
HSTMT hsmt - идентификатор оператора.
UCHAR szSqlState - SQLSTATE в качестве строки завершения.
SDWORD pfNativeError - в этом параметре и будет возвращена ошибка, возникшая в СУБД, а также ее собственный код. Если соответствующего собственного кода ошибки не существует, то возвращается ноль.
UCHAR szErrorMsg - указатель на буфер, куда будет возвращен текст ошибки (строка с нулевым окончанием).
SWORD cbErrorMsgMax - максимальный размер вышеописанного буфера, должен быть меньше или равен SQL_MAX_MESSAGE_LENGTH-1.
SWORD cbErrorMsg - сюда возвращается число байт, скопированных в буфер.
3. Непосредственное и подготавливаемое выполнение операторов SQL
Непосредственное выполнение используется в тех случаях, когда
SQLExecDirect представляет собой самый быстрый способ запустить SQL-оператор при одноразовом выполнении.
RETCODE SQLExecDirect (hstmt, szSqlStr, cbSqlStr)
HSTMT hstmt- идентификатор оператора.
UCHAR szSqlStr- строка с SQL-оператором.
SDWORD cbSqlStr - длина строки szSqlStr.
Подготавливаемое выполнение предпочтительнее использовать, когда необходима информация о результирующем множестве до выполнения оператора или когда требуется выполнить SQL-оператор более одного раза. Для этого необходимы две функции SQLPrepare и SQLExecute.
SQLPrepare подготавливает SQL-строку для выполнения:
RETCODE SQLPrepare (hstmt, szSqlStr, cbSqlStr)
HSTMT hstmt - идентификатор оператора
UCHAR szSqlStr- строка с SQL-оператором
SDWORD cbSqlStr - длина строки szSqlStr
SQLExecute выполняет подготовленный оператор:
RETCODE SQLExecute(hstmt)
HSTMT hstmt - идентификатор оператора
SQLPrepare и SQLExecDirect отличаются тем, что при вызове SQLPrepare оператор SQL в действительности не выполняется, вместо этого определяется путь доступа к данным источника данных. Использование подготавливаемого выполнения удобно для операторов, которые будут выполняться более одного раза. Так как путь доступа к данным уже определен, то выполнение может осуществляться несколько быстрее, чем при использовании SQLExecDirect. Кроме того, каждый вызов SQLExecute передает базе данных только идентификатор для планирования обращения, а не весь SQL-оператор.
4. Использование параметров при выполнении
Параметры используются при непосредственном и подготавливаемом выполнении.
Маркеры параметров определяются в SQL-операторах с помощью знаков "?". Например, SELECT n_post FROM s WHERE town=? или INSERT INTO p(name, town) VALUES (?,?). Для того, чтобы связать буфер с маркерами параметров, прикладная программа должна вызвать SQLBindParameter:
RETCODE SQLBindParameter (hsmt, ipar, fParamType, fCType, fSqlType, cbColDef, ibScale, rgbValue, cbValueMax, pcValue)
HSTMT hsmt - идентификатор оператора, он должен быть точно тем же идентификатором оператора, с которым этот оператор подготавливается и выполняется.
UWORD ipar - номер параметра для связи. В операторе SQL операторы нумеруются слева направо, начиная с 1. Например, для следующего SQL-оператора используется три параметрических маркера : INSERT INTO j (n_izd, name, town) VALUES (?,?,?). Чтобы связать эти параметры, SQLBindParameter вызывается три раза с ipar, установленным в 1, 2 и 3 соответственно.
SWORD fParamType - является типом параметра для связи и может принимать одно из трех значений: SQL_PARAM_INPUT, SQL_PARAM_INPUT_OUTPUT или SQL_PARAM_OUTPUT. SQL_PARAM_INPUT используется для процедур, использующих параметры ввода. SQL_PARAM_INPUT_OUTPUT маркирует параметр ввода/вывода в процедуре. SQL_PARAM_OUTPUT маркирует значение возврата или параметр вывода в процедуре.
SWORD fCType - является С-типом данных для параметра. Это тип данных из которого необходимо конвертировать данные.
SWORD fSqlType - является ODBC типом данных для параметра. Это тип данных в которых конвертируются данные и он должен совпадать с SQL-типом столбца, соответствующего этому параметрическому маркеру.
UDWORD сbColDef - точность столбца или выражения соответствующего маркера параметра.
SWORD ibScale - размер столбца или выражения соответствующего маркера параметра
PTR rgbValue - указатель буфера для данных параметра, который при вызове SQLExecute или SQLExecuteDirect содержит действительные значения параметра.
SDWORD сbValueMax - максимальная длина буфера rgbValue.
SDWORD pcbValue - указатель буфера для длины параметра.
Ниже приведены основные значения С- и SQL-типов параметров.
С-тип | SQL-тип | ||
SQL_C_BINARY | SQL_C_FLOAT | SQL_BINARY | SQL_DOUBLE |
SQL_C_BIT | SQL_C_TIME | SQL_BIT | SQL_FLOAT |
SQL_C_CHAR | SQL_C_DEFAULT | SQL_CHAR | SQL_INTEGER |
SQL_C_DATE | SQL_C_SLONG | SQL_DATE | SQL_REAL |
SQL_C_DOUBLE | SQL_C_SSHORT | SQL_DECIMAL | SQL_SMALLINT |
SQL_TIME | SQL_VARCHAR |
Настройка доступа к источнику данных включает:
Для настройки источника данных, необходимо проверить находится ли системный текстовый файл .odbc.ini в домашней директории пользователя и отредактировать его, настроив на требуемые источники данных.
В файле .odbc.ini должен быть под некоторым идентификатором описан требуемый источник данных, имя которого используется функцией SQLConnect(), и далее должен присутствовать раздел с данным именем, в котором содержатся атрибуты, описывающие источник данных. Файл .odbc.ini должен содержать имя источника данных, имя сервера баз данных, имя базы данных и другие атрибуты.
В переменной окружения ODBCINI необходимо указать полное имя системного файла .odbc.ini из домашней директории. Сделать это можно, либо введя с консоли соответствующую команду, либо поместив эту команду в файл загрузки .login. Форма записи команды зависит от используемой программы Shell-интерпретатора.
Системные требования зависят от той СУБД, с которой работает пользователь. Например, при работе с СУБД Informix это обеспечивается переменными окружения, выставленными в файле .cshrc в домашней директории пользователя.
Для получения доступа до ODBC-функций, в программе должен быть описан заголовочный файл sqlext.h. В файле sqltypes.h находятся описание типов данных используемых в ODBC.
Как и любой исходный файл, написанный на языке Си, файл с программой, вызывающей ODBC-функции, должен иметь расширение .с.
При компиляции необходимо подключить необходимые библиотеки, используемые в вызываемых функциях. Поскольку в этом случае командная строка принимает достаточно сложный вид, целесообразно на уровне системного администратора оформить командный файл, в котором подключаются необходимые библиотеки.
Последовательность выполнения лабораторной работы
Требования к разрабатываемой программе
Разрабатываемая программа должна удовлетворять следующим требованиям:
Варианты заданий
Вариант 1
Вариант 2
Вариант 3
Вариант 4
Вариант 5
Вариант 6
Вариант 7
Вариант 8
Контрольные вопросы