Методические указания к выполнению лабораторных и курсовой работ ЙошкарОла 2007
Скачать 0.8 Mb.
|
Соединение с базой данных в ODBC Цель работы: изучить функции ODBC для соединения с базой данных, а также функции для получения информации о драйвере и источнике данных, приобрести навыки использования данных функций при разработке клиентских приложений баз данных. Порядок выполнения работы 1.Ознакомиться с концепцией ODBC. 2. Изучить программный интерфейс функций SQLAllocEnv, SQLFreeEnv, SQLAllocConnect, SQLFreeConnect, SQLConnect, SQLDisconnect, а также функций SQLGetInfo и SQLGetFunctions. 3. Написать на языке программирования высокого уровня C/C++ программу, которая устанавливает соединение с источником данных, получает определенную вариантом задания информацию о драйвере и источнике данных, разъединяет соединение с источником данных. 4. Запустить ODBC-администратор и с его помощью выбрать ODBC-драйвер для используемого в программе источника данных. 5. Выполнить программу, разработанную в п.3. 6. Оформить отчет о проделанной работе. Содержание отчета 1.Задание; 2. Краткое описание используемых функций ODBC; 3. Краткое описание программы; 4. Листинг программы; 5. Результаты выполнения программы; Для последующих лабораторных работ содержание отчета будет иметь такую же структуру. Основные сведения Функция SQLAllocEnv Данная функция распределяет память для идентификатора среды и инициализирует интерфейс ODBC для использования прикладной программой. Функция SQLAllocEnv имеет следующий синтаксис: RETCODE SQLAllocEnv(phev), где phenv – адрес идентификатора среды (выходной параметр типа HENV FAR *). Поскольку в рамках одной среды можно установить произвольное число соединений, для каждой прикладной программы достаточно выделить только один идентификатор среды. Функция SQLFreeEnv Данная функция освобождает идентификатор среды, а также всю назначенную ему память. Функция SQLFreeEnv имеет следующий синтаксис: RETCODE SQLFreeEnv(henv), где henv – идентификатор среды (входной параметр типа HENV). Функция SQLAllocConnect Данная функция распределяет память для идентификатора соединения в рамках среды, определенной с помощью идентификатора henv. Функция SQLAllocConnect имеет следующий синтаксис: RETCODE SQLAllocConnect(henv, phdbc) Описание параметров для данной функции приведено в следующей таблице.
Функция SQLFreeConnect Данная функция освобождает идентификатор соединения и всю связанную с ним память. Функция SQLFreeConnect имеет следующий синтаксис: RETCODE SQLFreeConnect(hdbc), где hdbc – идентификатор соединения (входной параметр типа HDBC). Функция SQLConnect Функция SQLConnect загружает драйвер базы данных и устанавливает соединение с источником данных. Функция SQLConnect имеет следующий синтаксис: RETCODE SQLConnect(hdbc, szDSN, cbDSN, szUID, cbUID, szAuthStr, cbAuthStr) Описание параметров для данной функции приведено в следующей таблице.
Если строка имени источника данных, строка идентификатора пользователя или строка пароля имеют нулевое окончание, то, соответственно, cbDSN, cbUID или cbAuthStr могут быть установлены в SQL_NTS. Если источник данных не требует имени пользователя (пароля), то нулевое значение или пустая строка должны быть переданы в szUID (szAuthStr), нулевое значение или SQL_NTS - в cbUID (cbAuthStr). Функция SQLDisconnect Данная функция закрывает соединение с источником данных. Функция SQLDisconnect имеет следующий синтаксис: RETCODE SQLDisconnect(hdbc), где hdbc – идентификатор соединения (входной параметр типа HDBC). Функция SQLGetInfo Данная функция возвращает общую информацию о драйвере и источнике данных, соответствующих заданному идентификатору соединения. Функция SQLGetInfo имеет следующий синтаксис: RETCODE SQLGetInfo(hdbc, fInfoType, rgbInfoValue, cbInfoValueMax, cbInfoValue) Описание параметров для данной функции приведено в следующей таблице.
В зависимости от запрашиваемого fTypeInfo возвращаемая ин- формация будет одного из нижеследующих типов: строка символов с нуль-окончанием, 16-битное целое значение, 32-битный флаг или 32- битное двоичное значение. Ниже приведены некоторые значения fTypeInfo и их содержательная трактовка: SQL_DATABASE_NAME – имя базы данных, SQL_DBMS_NAME – имя СУБД, SQL_DRIVER_NAME –имя драйвера, SQL_ACTIVE_STATEMENT – число активных операторов в соединении. Для определения типов выборки, связанных с курсором, используется SQL_FETCH_DIRECTION. В качестве результата вызова функции возвращается 32-разрядная битовая маска, в которой выделяются следующие битовые маски: SQL_FD_FETCH_NEXT,SQL_FD_FETCH_FIRST, SQL_FD_FETCH_LAST,SQL_FD_FETCH_PRIOR, SQL_FD_FETCH_ABSOLUTE, SQL_FD_FETCH_RELATIVE. Чтобы выяснить, поддерживает ли источник данных позиционные операторы DELETE и UPDATE, следует использовать POSITIONED_STATEMENTS. При этом будет возвращена 32-разрядная битовая маска, которая перечисляет, какие позиционные SQL-операторы поддерживаются. Битовыми масками являются SQL_PS_POSITIONED_DELETE, SQL_PS_POSITIONED_UPDATE и SQL_PS_SELECT_FOR_UPDATE. Функция SQLGetFunctions Данная функция определяет, поддерживает ли драйвер заданную функцию ODBC. Функция SQLGetFunctions имеет следующий синтаксис: RETCODE SQLGetFunctions(hdbc, fFunction, pfExists) Описание параметров для данной функции приведено в следующей таблице.
Значение параметра fFunction должно быть вида: SQL_API_???, где ??? – имя ODBC-функции. Например, для функции SQLGetInfo значением fFunction будет SQL_API_SQLGETINFO. Коды возврата функций ODBC
Функция SQLError Для получения дополнительной информации в случае возникновения ошибки (при этом кодом завершения ODBC-функции является значение SQL_ERROR SQL_SUCCESS_WITH_INFO) следует воспользоваться функцией SQLError. Функция SQLError имеет следующий синтаксис: RETCODE SQLError(henv, hdbc, hstmt, szSqlState, pfNativeError, szErrorMsg, cbErrorMsgMax, cbErrorMsg) Описание параметров для данной функции приведено в следующей таблице.
Идентификаторы среды, соединения и оператора могут принимать нулевые значения – SQL_NULL_HENV, SQL_NULL_HDBC и SQL_NULL_HSTMT, соответственно. Функция SQLError возвращает информацию об ошибке для крайнего справа ненулевого идентификатора. Для строки состояния требуется шесть байт, из них пять – собственно для состояния, последний байт – нуль-окончание. В ряде случаев информация об ошибке может состоять более чем из одной части. В таких случаях для выборки информации функцию SQLError следует вызывать более одного раза. Методические указания Обобщенный алгоритм использования ODBC в прикладных программах представлен ниже (в скобках указаны основные используемые функции). Фаза инициализации Шаг 1. Назначение идентификатора среды (SQLAllocEnv) Шаг 2. Назначение идентификатора соединения (SQLAllocConnect) Шаг 3. Соединение с сервером (SQLConnect) Шаг 4. Назначение идентификатора оператора (SQLAllocStmt) Фаза обработки SQL операторов Шаг 5. Выполнение оператора (SQLExecDirect, SQLPrepare, SQLExecute) Шаг 6. Выборка данных (SQLFetch, SQLBindCol, SQLGetData, SQLExtendedFetch) Фаза завершения Шаг 7. Освобождение идентификатора оператора (SQLFreeStmt) Шаг 8. Разрыв соединения с сервером (SQLDisconnect) Шаг 9. Освобождение идентификатора соединения (SQLFreeConnect) Шаг 10. Освобождение идентификатора окружения(SQLFreeEnv) Вышеприведенный алгоритм являетсяобщим для лабораторных работ NN 3-5. В данной лабораторной работе используется алгоритм, включающий шаги 1, 2, 3, использование функций SQLGetFunctions и SQLGetInfo, шаги 8, 9, 10 в приведенном порядке. Для возможности работы с функциями ODBC в программу на языках С или С++ необходимо включить заголовочный файл sql.h директивой #include Настройка ODBC производится следующим образом. В окне Control Panel щелкните мышью на пиктограмме ODBC. В появившемся окне выберите закладку User DSN, нажмите кнопку Add. В появившемся списке выберите SQL Server. Нажмите кнопку Finish. После этого в появившемся диалоговом окне ODBC SQL Server Setup заполните определенные поля. В поле Data Source Name впишите имя использующегося в прикладной программе источника данных (например, my_source), а в поле Server - имя используемого SQL-сервера (например, VT30213_S). В этом же диалоговом окне нажмите кнопку Options и в открывшемся окне в поле Database впишите имя используемой базы данных SQL Server (например, dbstud2). При этом имя источника данных связывается с указанной базой данных. Варианты заданий Задание типа А: Определить, поддерживает ли драйвер заданную функцию. 1. SQLAllocEnv, SQLMoreResults, SQLDriverConnect, SQLRowCount; 2. SQLFreeEnv, SQLColumnPrivileges, SQLStatistics, SQLParamData; 3. SQLAllocConnect, SQLExtendedFetch, SQLDrivers, SQLPutData; 4. SQLFreeConnect, SQLSetStmtOption, SQLColumns, SQLTransact; 5. SQLConnect, SQLGetCursorName, SQLTables, SQLGetTypeInfo; 6. SQLDisconnect, SQLSetConnectOption, SQLProcedure, SQLColAttributes; 7. SQLAllocStmt, SQLDataSources, SQLGetConnectOption, SQLCancel; 8. SQLFreeStmt, SQLSpecialColumns, SQLParamOption, SQLGetInfo; 9.SQLExecDirect, SQLTablePrivileges, SQLDescribeCol, SQLNativeSql; 10. SQLExecute, SQLGetData, SQLSetCursorName, SQLGetFunctions; 11. SQLPrepare, SQLFetch, SQLProcedureColumns, SQLPrimaryKeys; 12. SQLBindCol, SQLForeignKeys, SQLNumResultCols, SQLSetPos. ЗаданиетипаБ: Выбрать информацию об источнике данных. Тип выбираемых данных помечается символами S, B, N, заключенными в круглые скобки. Тип данных, отмеченный символом S, соответствует символьной строке, а символом N – числовому значению. Тип данных, отмеченный символом ?, является логическим. При этом надо определить, поддерживает ли источник данных указанные возможности. 1. Имя текущей базы данных (S); 2. Имя СУБД (S); 3. Имя драйвера (S); 4. Курсор с выборкой следующей строки (?); 5. Курсор с выборкой первой строки (?); 6. Курсор с выборкой последней строки (?); 7. Курсор с выборкой предыдущей строки (?); 8. Курсор с выборкой N-й строки (?); 9. Курсор с выборкой N-й строки по отношению к текущей позиции (?); 10. Оператор позиционного удаления (?); 11. Оператор позиционной модификации (?); 12. Число активных операторов в соединении (N). Лабораторная работа N 4 Выполнение операторов SQL в ODBC Цель работы: изучить функции ODBC для выполнения SQL- операторов, приобрести навыки использования данных функций при разработке клиентских приложений баз данных. Порядок выполнения работы и варианты заданий 1. Изучить программный интерфейс функций SQLAllocStmt, SQLFreeStmt, SQLExecDirect, SQLPrepare, SQLExecute, SQLBindParameter. 2. Написать на языке программирования высокого уровня C/C++ программу для создания и заполнения данными таблицы в соответствии с заданием лабораторной работы N 2. Также программа должна содержать возможность создания и вызова хранимой процедуры, триггеров, пользовательской функции, и просмотра результатов работы. Пользовательский интерфейс программы должен включать формы с полями ввода для занесения информации в таблицу. При нечетном номере варианта задания использовать прямое выполнение SQL-оператора, а при четном – подготавливаемое. 3. Запустить ODBC-администратор и с его помощью выбрать ODBC-драйвер для используемого в программе источника данных. 4. Выполнить программу, разработанную в п.2. 5. Оформить отчет о проделанной работе. Основные сведения Функция SQLAllocStmt Данная функция распределяет память для идентификатора оператора в рамках определенного соединения. Функция SQLAllocStmt имеет следующий синтаксис: RETCODE SQLAllocStmt(hdbc, phstmt) Описание параметров для данной функции приведено в следующей таблице.
Функция SQLFreeStmt Данная функция выполняет следующие действия: • останавливает обрабатываемые SQL-операторы, связанные с заданным идентификатором оператора; • закрывает открытые курсоры, имеющие отношение к заданному идентификатору оператора; • отбрасывает ожидаемые результаты; • освобождает все ресурсы, связанные с заданным идентификатором оператора. Функция SQLFreeStmt имеет следующий синтаксис: RETCODE SQLFreeStmt(hstmt, fOption) Описание параметров для данной функции приведено в следующей таблице.
Опция SQL_CLOSE закрывает курсор и отбрасывает все ожидаемые результаты. Опция SQL_DROP освобождает идентификатор оператора и все связанные с ним ресурсы, а также выполняет действия предыдущей опции. Опция SQL_UNBIND освобождает (“отвязывает”) все столбцы, используемые соответствующей функцией SQLBindCol. Опция SQL_RESET_PARAMS освобождает все параметры, используемые соответствующей функцией SQLBindParameter. Перечисленные опции используются применительно к заданному идентификатору оператора. Функция SQLExecDirect Данная функция выполняет SQL-оператор. Если в операторе существуют какие-либо параметры, то при выполнении используются их текущие значения. ФункцияSQLExecDirect имеет следующий синтаксис: RETCODE SQLExecDirect(hstmt, szSqlStr, cbSqlStr) Описание параметров для данной функции приведено в таблице.
Функция SQLExecDirect представляет самый быстрый способ запустить SQL-оператор при одноразовом выполнении. Функция SQLPrepare Данная функция подготавливает SQL-строку для выполнения. Функция SQLPrepare имеет следующий синтаксис: RETCODE SQLPrepare(hstmt, szSqlStr, cbSqlStr) Данная функция имеет такие же параметры, что и функция SQLExecDirect. Функция SQLExecute Данная функция выполняет подготовленный SQL-оператор. Если в операторе существуют какие-либо параметры, то при выполнении используются их текущие значения. Функция SQLExecute имеет следующий синтаксис: RETCODE SQLExecute(hstmt), где hstmt – идентификатор оператора (входной параметр типа HSTMT). Перед вызовом функции SQLExecute должна быть выполнена функция SQLPrepare. Функция SQLBindParameter Данная функция связывает параметр SQL-оператора с буфером, где хранится его значение. Функция SQLBindParameter имеет следующий синтаксис: RETCODE SQLBindParameter(hstmt, ipar, fParamType, fCType, fSqlType, cbColDef, ibScale, rgbValue, cbValueMax, pcbValue) Описание параметров для данной функции приведено в следующей таблице.
Параметры в SQL-операторах отмечаются маркером ?. Пример: INSERT INTO Emp(empid, firstname) VALUES (?,?). Нумерация параметров начинается с 1. Тип параметра fParamType может принимать одно из трех значений: SQL_PARAM_INPUT, SQL_PARAM_INPUT_OUTPUT или SQL_PARAM_OUTPUT. Значение SQL_PARAM_INPUT используется для всех параметров, которые не включены в процедуру, а также для процедур, использующих параметры ввода. Значение SQL_PARAM_INPUT_OUTPUT маркирует параметр ввода/вывода в процедуре. Значение SQL_PARAM_OUTPUT маркирует значение возврата или параметр вывода в процедуре. С-тип данных - это тип данных, из которого конвертируются данные. C-тип данных параметра может быть одним из следующих значений: SQL_C_BINARY, SQL_C_BIT, SQL_C_CHAR, SQL_C_DATE, SQL_C_DEFAULT, SQL_C_DOUBLE, SQL_C_FLOAT, SQL_C_SLONG, SQL_C_SSHORT, SQL_STINYINT, SQL_C_TIME, SQL_C_TIMESTAMP, SQL_C_ULONG, SQL_C_USHORT, SQL_C_UTINYINT, SQL_C_DEFAULT. SQL-тип данных - это тип данных, в который конвертируются данные. Он должен совпадать с SQL-типом соответствующего столбца. SQL-тип данных может быть одним из следующих значений: SQL_BIGINT, SQL_BINARY, SQL_BIT, SQL_CHAR, SQL_DATE, SQL_DECIMAL, SQL_DOUBLE, SQL_FLOAT, SQL_INTEGER, SQL_LONGVARBINARY, SQL_LONGVARCHAR, SQL_NUMERIC, SQL_REAL, SQL_SMALLINT, SQL_TIME, SQL_TIMESTAMP, SQL_TINYINT, SQL_VARBINARY, SQL_VARCHAR. Пример вызова функции SQLBindParameter: rc=SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, TEST_LEN, 0, szTEST, 0, &cbTEST); Методические указания Данная лабораторная работа основывается на результатах предыдущей лабораторной работы. При выполнении данной лабораторной работы используются шаги 1-5, 1-10 алгоритма использования ODBC, представленного в предыдущей работе, в приведенном порядке. Лабораторная работа N 5 Выборка данных из результирующего множества в ODBC Цель работы: изучить функции ODBC для выборки данных из результирующей таблицы, изучить скроллируемые курсоры в ODBC, приобрести навыки использования данных функций при разработке клиентских приложений баз данных. Порядок выполнения работы и варианты заданий 1. Изучить программный интерфейс функций SQLFetch, SQLBindCol, SQLGetData, SQLExtendedFetch, SQLSetStmtOption. 2. Написать на языке программирования высокого уровня С/C++: а) программу для создания курсора в ODBC. Определение курсора берется из вариантов заданий к лабораторной работе N 2. При нечетном номере варианта задания следует использовать статические курсоры, а при четном – динамические. б) программу для просмотра результирующей таблицы с использованием функций SQLFetch и SQLBindCol (для нечетного номера варианта задания) и функции SQLGetData (для четного номера варианта задания); в) программу для различных типов выборки строк из результирующей таблицы с использованием функции SQLExtendedFetch. Пользовательский интерфейс программы должен включать элементы управления (например, кнопки, диалоговые окна и т.д.) для показа первой, последней, следующей и предыдущей строк, а также строк с абсолютным и относительным номером N. 3. Запустить ODBC-администратор и с его помощью выбрать ODBC-драйвер для используемого в программе источника данных. 4. Выполнить программу, разработанную в п.2. 5. Оформить отчет о проделанной работе. Основные сведения Функция SQLBindCol Данная функция назначает область хранения в памяти и тип данных для столбца результирующей таблицы. Функция SQLBindCol имеет следующий синтаксис: RETCODE SQLBindCol(hstmt, icol, fcType, rgbValue, cbValueMax, pcbValue) Описание параметров функции приведено в следующей таблице.
Столбцы результирующей таблицы нумеруются слева направо, начиная с 1. Функция SQLFetch Данная функция извлекает очередную строку данных из результирующей таблицы, причем возвращаются данные для всех столбцов, которые были связаны с помощью функции SQLBindCol. Синтаксис функции SQLFetch: RETCODE SQLFetch(hstmt), где hstmt – идентификатор оператора (входной аргумент типа HSTMT). Функция SQLGetData Эта функция позволяет выполнить выборку данных из столбцов, которые не были связаны с помощью функции SQLBindCol. Функция SQLGetData имеет следующий синтаксис: RETCODE SQLGetData(hstmt, icol, fCType, rgbValue, rgbValueMax, pcbValue) Данная функция имеет те же параметры, что и функция SQLBindCol. Функция SQLGetData полезна в тех случаях, когда нет нужды выполнять выборку одних и тех же столбцов для каждой строки результирующей таблицы при вызове SQLFetch. Функция SQLExtendedFetch Данная функция используется вместо функции SQLFetch для выборки строк результирующей таблицы. Функция SQLExtendedFetch расширяет функциональность функции SQLFetch, поскольку предусматривает блочные и скроллируемые (перемещаемые) курсоры. Функция SQLExtendedFetch имеет следующий синтаксис: RETCODE SQLExtendedFetch(hstmt,fFetchType, irow, pcrow, rgfRowStatus) Описание параметров функции приведено в следующей таблице.
ODBC поддерживает статические и динамические курсоры. Статические курсоры нечувствительны к изменениям базовых таблиц, а динамические являются полностью чувствительными. Движение курсора устанавливается с помощью параметров fFetchType и irow. В приведенной ниже таблице определены значения параметра fFetchType и соответствующие им результаты выборки функции SQLExtendedFetch.
В приведенной таблице значение N определяется параметром irow. В данной лабораторной работе не используются блочные курсоры, по умолчанию считается, что строковое множество состоит из одной строки. Методические указания Создание курсора в ODBC не предполагает использование SQL- оператора объявления курсора. Курсор создается автоматически при выполнении оператора выборки SELECT. При этом идентификатор данного оператора SELECT должен использоваться для выборки данных из результирующей таблицы. При выполнении данной лабораторной работы в полном объеме используется алгоритм использования ODBC, приведенный в описании лабораторной работы N 3. Для выборки всех данных из заданных столбцов результирующей таблицы с помощью функций SQLBindCol и SQLFetch следует использовать следующий алгоритм: 1. Вызвать функцию SQLBindCol один раз для каждого столбца, который должен быть возвращен из результирующей таблицы. 2. Вызвать функцию SQLFetch для перемещения курсора на следующую строку и возврата данных из связанных столбцов. 3. Повторить шаг 2 до тех пор, пока функция SQLFetch не возвратит SQL_NO_DATA_FOUND. Для выборки всех данных из заданных столбцов результирующей таблицы с помощью функций SQLGetData и SQLFetch следует использовать следующий алгоритм: 1. Вызывать функцию SQLFetch для перемещения курсора на следующую строку. 2. Вызвать функцию SQLGetData для каждого из заданных столбцов. 3. Повторить шаги 1 и 2 до тех пор, пока функция SQLFetch не возвратит SQL_NO_DATA_FOUND. Прежде чем использовать перемещаемые курсоры, необходимо проверить, поддерживает ли драйвер функцию SQLExtendedFetch. Затем рекомендуется проверить, какие типы выборки допускает курсор (см. лабораторную работу N 3, варианты заданий типа B NN 4-9). После этого необходимо установить тип курсора (скроллируемый) с помощью функции SQLSetStmtOption. Пример вызова функции SQLSetStmtOption: Rc=SQLSetStmtOption(hstmt, SQL_CURSOR_TYPE, SQL_CURSOR_DYNAMIC); В данном случае выбран динамический курсор. Для выбора статического курсора необходимо использовать опцию SQL_CURSOR_STATIC. Курсовой проект |