Вы на НеОфициальном сайте факультета ЭиП

На нашем портале ежедневно выкладываются материалы способные помочь студентам. Курсовые, шпаргалки, ответы и еще куча всего что может понадобиться в учебе!
Главная Контакты Карта сайта
 
Где мы?

Реклама


Лекции по SQL. Часть 4.

Просмотров: 1581 Автор: admin

Лекции по SQL

1.1. SQL API

1.1.1.Назначение/освобождение окружения

 

Назначение идентификатора окружения:

RETCODE SQLAllocEnv(HENV FAR *phenv);

При ошибке возвращает SQL_ERROR, при успехе - SQL_SUCCESS.

Освобождение идентификатора окружения:

RETCODE SQLFreeEnv(HENV FAR *phenv);

 

Пример обращения:

HENV henv;

..............

SQLAllocEnv(&henv);

..............

SQLFreeEnv(henv);

 

1.1.2.    Назначение/освобождение соединения

    Назначение идентификатора соединения:

RETCODE SQLAllocConnect(HENV nv, HDBC FAR *phdbc);

Возврат: SQL_SUCCESS,      SQL_SUCCESS_WITH_INFO,      SQL_ERROR,

SQL_INVALID_HANDLE.

 

Освобождение идентификатора соединения:

RETCODE SQLFreeConnect(HDBC hdbc);

Возврат: аналогично.

 

1.1.3.    Соединение/отсоединение

    Соединение с источником данных с помощью базовых функций:

RETCODE SQLConnect (HDBC hdbc,           // идентификатор соединения

           UCHAR FAR * szDSN,   // имя источника данных

           SWORD sbDSN,         // длина имени источника

                                // м.быь равна SQL_NTS, если

                                // строка заканчивается нулем

           UCHAR FAR *szUID,    // идентификатор пользователя

           SWORD sbUID,         // его длина (SQL_NTS)

           UCHAR FAR * szAuthStr, // пароль

           SWORD cbAuthStr);      // его длина (SQL_NTS)

Для одноранговых СУБД, таких, как dBase или Btrieve для установки соединения требуется только идентификатор соединения  и имя источника данных, остальные пара­метры - ноль или пустая строка.

 

 тсоединение от источника данных:

SQLDisconnect(HDBC hdbc);

 

Получить имена потенциальных источников данных:

RETCODE SQLDataSources(

   HENV       henv,            // идентификатор окружения

   UWORD fDirection, // принимает значения SQL_FETCH_FIRST или

                     // SQL_FETCH_NEXT. Определяет выбрать первый

                     // или следующий источник

   UCHAR FAR *szDSN, // указатель на имя источника

   SWORD      cbSNMax, // Максимальная длина имени источника

                       // (не требуется более SQL_MAX_DSN_LENGTH+1)

   SWORD FAR *pcbDSN,  // число байт возвращенного имени источника

                       // (не считая хвостового нуля)

   UCHAR FAR *szDescription, // Указатель на полученное описание

   SWORD      cbDescriptionMax, // число байт данное под описание

   SWORD FAR *pcbDescription); // число байт полученного описания

 

Функция возвращает  источники поочередно по одному за обращение. Окончание определяется по коду возврата SQL_NO_DATA_FOUND.

 

Многие СУБД кроме имени пользователя и пароля имеют  и другие атри­бу­ты  соединения.  Эти  атрибуты  являются разными для разных СУБД,  и, поэ­то­му ODBC должна выполнить присоединение к источнику другим способом.

 

RETCODE SQLDriverConnect(

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

  HWND hwnd,  // идентификатор окна. Программа может передать

              // идентификатор родительского окна или 0, если

              // SQLDriverConnect не имеет диалога

  UCHAR FAR *szConStrIn, // строка полного соединения, строка

              // частичного соединения или пустая строка

  SWORD cbConStrIn, // длина szConStrIn

  UCHAR FAR *szConStrOut, // указатель на строку законченного

                    // соединения (не < 255 байт)

  SWORD cbConStrOutMax, // максимальная длина szConStrOut

  SWORD FAR *pcbConStrOut, // действительная длина строки завер-

                    // шенного соединения

  fDriverCompletion); // Входной флаг, указывающий должен ли

            // Менеджер  драйверов или драйвер вести диалог для

            // выяснения недостающих атрибутов соединения.

            // Может принимать значения:

            // SQL_DRIVER_PROMPT,SQL_DRIVER_COMPLETE,

            // SQL_DRIVER_COMPLETE_REQUIRED,SQL_DRIVER_NOPROMPT.

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

<имя атрибута>=<значение атрибута>, разделяемых точкой с запятой.

    Например:

DSN=ACCOUNTING;UID=BILLM;PWD=LANDSHARK;SN=ACCSERV

где DSN - имя источника данных

    UID - имя пользователя

    PWD - пароль

    SN  - имя сервера

Строка соединения полностью или частично заполняется  приложением  и  мо­жет содержать атрибуты,  специфические для конкретного драйвера. Недо­ста­ю­щие данные в строке соединения должна заполнить функция  SQLDriver­Con­nect.  Если  szConStrIn  не содержит DSN или DRIVER,  то менеджер драйверов вы­полняет описанные ниже действия:

  SQL_DRIVER_PROMPT:

открывает окно диалога "Источники данных",  которое  содержит все имена ис­точ­ников данных. Пользователь должен выбрать источник данных.

  SQL_DRIVER_COMPLETE или SQL_DRIVER_COMPLETE_REQUIRED:

ес­ли не задан DSN, то также как в случае SQL_DRIVER_PROMPT, в противном случае используется указанный DSN.

Менеджер драйверов не выполняет приглашения на ввод, если задано SQL_DRIVER_NOPROMPT или в строке соединения имеется ключевое слово DRIVER.  Если строка содержит DSN, то загружается соответствующий драйвер, определенный в ODBC.INI. Если определено DRIVER, а не DSN,  то загружается этот драйвер.  Если не определено ни то ни другое, то загружается драйвер по умолчанию.

Как только менеджер драйверов определит  какой  драйвер  надо загружать, он передает строку соединения функции SQLDriverConnect этого драйвера.  По­доб­но менеджеру драйверов,  драйвер  выполняет различные  действия в зави­си­мос­ти от значения fDriverCompletion и содержимого строки соединения.  Драйвер не  может  загрузить  какую-либо  информацию  для  источника  дан­ных,  если задан атрибут DRIVER.

 

RETCODE SQLDrivers(

   HENV henv,

   UWORD fDirection, // SQL_FETCH_FIRST, SQL_FETCH_NEXT

   UCHAR FAR *szDriverDesc, // указатель на извлекаемое описание

                            // драйвера

   SWORD cbDriverDescMax, // длина буфера szDriverDesc

   SWORD FAR * pcbDriverDesc, // действительная длина описания

   UCHAR FAR * szDriverAttr, // возвращаемые атрибуты драйвера

   SWORD FAR * pcbDriverAttr // длина описания атрибутов драйвера

);

Эта функция позволяет определить драйверы, имеющиеся в распоряжении.

 

1.1.4. Выполнение SQL - операторов

1.1.4.1.Назначение и освобождение идентификатора оператора.

 

Назначение идентификатора  оператора  выполняется функцией

 

RETCODE  SQLAllocStmt(HDBC  hdbc,HSTMT  FAR  *phstmt); 

 

По адресу phstmt размещается память для оператора.

 

Освобождение оператора:

RETCODE SQLFreeStmt(HSTMT hstmt, UWORD fOption);

    fOption может принимать значения:

    SQL_CLOSE -  отбрасывает неизвлеченные результаты и закрывает курсор.  Позднее программа вновь сможет открыть курсор, связанный с оператором.

    SQL_DROP - освобождает все ресурсы, связанные с оператором.

    SQL_UNBIND - освобождает буферы столбцов, размещенные функцией SQLBindCol

    SQL_RESET_PARAMS - освобождает буферы параметров, размещенныефункций SQLBindParameter

    Прикладной программе  может потребоваться выполнить несколькопоследо­ва­тель­ных вызовов SQLFreeStmt.  Например,  для того, чтобы освободить па­ра­метр и отбро­сить его ожидаемое результирующее множество,  SQLFreeStmt нужно вызвать  дважды:  для  первого  вызова fOption=SQL_RESET_PARAMS, для второго - SQL_CLOSE.

 

1.1.4.2.SQLExecDirect

 

    Функция подготавливает и выполняет SQL-оператор:

RETCODE SQLExecDirect(

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

  UCHAR FAR * szSqlStr, // SQL-оператор

  SDWORD cbSqlStr); // его длина (м.быть SQL_NTS)

);

Данную функцию используют,  если есть уверенность в том,  что SQL опе­ра­тор должен быть выполнен однократно,  то  есть  что  он больше не по­на­до­бит­ся.

 

1.1.4.3.SQLPrepare и SqlExecute

Функция SQLPrepare подготавливает выполнение SQL оператора, а функция SQLExecute выполняет подготовленный оператор.  Этой парой целесообразно поль­зо­ваться в случае когда SQL - оператор используется неоднократно.

    Прототипы этих функций:

RETCODE SQLPrepare(

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

  UCHAR FAR * szSqlStr, // SQL - оператор

  SDWORD cbSqlStr // длина SQL _ оператора

);

 

RETCODE SQLExecute(HSTMT hstmt);

 

1.1.4.4.SQLBindParameter

 

SQL - оператор может иметь параметры, связывающие его с переменными при­клад­­ной программы.  Места параметров (маркеры) определяются в SQL-операторах с помощью символа "?".

Например:

SELECT * FROM S WHERE np=?

  или

INSERT INTO EMP (empid, firstname) VALUES (?,?)

    Связывание маркеров   и   параметров   выполняется   функциейSQLBindParameter.

Прототип:

RETCODE SQLBindParameter(

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

  UWORD ipar,  // номер параметра, упорядоченный слева направо

               // отсчет от 1

  SWORD fParamType, // тип параметра, который может принимать

                    // одно из значений: SQL_PARAM_INPUT,

                    // SQL_PARAM_INPUT_OUTPUT, SQL_PARAM_OUTPUT

  SWORD fCtype, // C-тип данных параметра, который может принимать

                // значения: SQL_C_BINARY, SQL_C_BIT, SQL_C_СHAR,

                // SQL_C_DATE, SQL_C_DEFAULT, SQL_C_DOUBLE,

                // SQL_C_FLOAT, SQL_C_SLONG, SQL_C_SSHORT,

                // SQLC_STINYINT, SQL_C_TIME, SQL_C_TIMESTAMP,

                // SQL_C_ULONG, SQL_C_USHORT, SQL_C_UTINY_INT,

                // Отметим, что SQL_C_DEFAULT означает, что значение

                // параметра было передано из С-типа данных по

                // умолчанию в SQL-тип данных, определенный fSqlType.

  SWORD fSqlType, // SQL-тип данных параметра, который может быть

                  // один из следующих: SQL_BIGINT, SQL_BINARY,

                  // SQL_BIT, SQL_CHAR, SQL_DATE, SQL_DECIMAL,

                  // SQL_DOUBLE, SQL_FLOAT, SQL_INTEGER,

                  // SQL_LONGVARBINARY, SQL_NUMERIC, SQL_REAL,

                  // SQL_SMALLINT, SQL_TIME, SQL_TIMESTAMP,

                  // SQL_TINYINT, SQL_VARBINARY, SQL_VARCHAR

  UDWORD cbColDef, // число байт, которое будет послано в параметр

                   // для типов SQL_LONGVARBINARY или SQL_LONGVARCHAR

                   // когда приложение на ODBC 2.0 вызывает драйвер

                   // ODBC 1.0 и данные будут пересылаться с помощью

                   // SQLPutData.

  SWORD ibScale,   // масштаб столбца или выражения, соответствующего

                   // маркеру параметра.

  PTR rgbValue,    // указатель буфера данных для параметра, который

                   // при вызове SQLExecute или SQLExecDirect

                   // содержит действительное значение параметра

  SDWORD cbValueMax, // Максимальная длина параметра.

                     // Используется только тогда, когда тип

                     // SQL_LONGVARBINARY или SQL_LONGVARCHAR

  SDWORD FAR * pcbValue // Указатель на действительную длину

                        // параметра для SQL_LONGVARCHAR и

                        // SQL_LONGVARBINARY или одно из значений:

                        // SQL_NTS,  SQL_NULL_DATA,  SQL_DATA_AT_EXEC,

                        // SQL_DEFAULT_PARAM. Для типов предопределенной

                        // длины игнорируется.

);  

Параметр cbColDef - точность столбца.

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

Параметр ibscale - масштаб.

Масштаб числового столбца или параметра  есть максимальное число цифр спра­ва от десятичной точки. Для числа с плавающей точкой  масштаб не опре­де­лен.


Тип SQL_C_DEFAULT  подразумевает C-тип по умолчанию:


SQL_CHAR                     SQL_C_CHAR

SQL_VARCHAR                 SQL_C_CHAR

SQL_LONGVARCHAR         SQL_C_CHAR

SQL_DECIMAL                  SQL_C_CHAR

SQL_NUMERIC                  SQL_C_CHAR

SQL_BIT                                   SQL_C_BIT

SQL_TINYINT                      SQL_C_STINYINT или  SQL_C_UTINYINT

SQL_SMALLINT                 SQL_C_SSHORT или SQL_C_USHORT

SQL_INTEGER                   SQL_C_SLONG or SQL_C_ULONG

SQL_BIGINT                   SQL_C_CHAR

SQL_REAL                      SQL_C_FLOAT

SQL_FLOAT                   SQL_C_DOUBLE

SQL_DOUBLE                    SQL_C_DOUBLE

SQL_BINARY                      SQL_C_BINARY

SQL_VARBINARY      SQL_C_BINARY

SQL_LONGVARBINARY SQL_C_BINARY

SQL_DATE                      SQL_C_DATE

SQL_TIME                       SQL_C_TIME

SQL_TIMESTAMP     SQL_C_TIMESTAMP


Пример:

#define NAME_LEN 30

 

UCHAR       szName[NAME_LEN];

SWORD       sAge;

SDWORD      cbName = SQL_NTS, cbAge = 0, cbBirthday = 0;

DATE_STRUCT dsBirthday;

 

retcode = SQLPrepare(hstmt, "INSERT INTO EMPLOYEE"

 " (NAME, AGE, BIRTHDAY) VALUES (?, ?, ?)", SQL_NTS);

 

if (retcode == SQL_SUCCESS) {

/* Определим типы данных и буферы */

/* данных для параметров Name, Age, Birthday.*/

    SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR,

                     SQL_CHAR, NAME_LEN, 0, szName, 0, &cbName);

    SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT,

                     SQL_SMALLINT, 0, 0, &sAge, 0, &cbAge);

    SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_DATE,

                     SQL_DATE, 0, 0, &dsBirthday, 0, &cbBirthday);

    strcpy(szName, "Иван Иванов"); /* Присвоить значения */

    sAge = 40;                       /* аргументам */

    dsBirthday.year = 1952;

    dsBirthday.month = 2;

    dsBirthday.day = 29;

    retcode = SQLExecute(hstmt); /* Выполнить оператор */

}

 

1.1.4.5. SQLParamOptions

 

            Функция SQLParamOption позволяет прикладной программе определить мно­жество значений для набора параметров, которые назначаются с помощью SQLBindParameter. Эта функция особенно полезна, когда нужно выполнить один и тот же SQL-оператор для разных значений параметров.

 

RETCODE SQLParamOptions(

HSTMT             hstmt, // дескриптор оператора

UDWORD  crow, //  число значений для каждого параметр

// если crow > 1, то rgbValue в SQLBindParameter указывает на массив значений

// параметра, а pcbValue указывает на массив длин.

UDWORD FAR *        pirow  // указатель на память для хранения текущего

// номера строки. Когда  обрабатывается очередное  значение параметра, pirow

// устанавливается равным номеру этой строки. Номер  строки не будет

// возвращен, если pirow==NULL.Номер начальной строки равен 1. Содержимое

// pirow можно использовать, например, следующим образом: - если возвра­ща­

// ется SQL_NEED_DATA, то можно установить при каком значении параметра

// это произошло.

Пример.

#define CITY_LEN 256

SDWORD cbValue[ ] = {SQL_NTS, SQL_NTS, SQL_NTS, SQL_NTS, SQL_NTS};

UCHAR  szData[ ][CITY_LEN] = {"Boston","New York","Keokuk","Seattle", "Eugene"};

UDWORD irow;

SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, 0);

SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_DEFAULT, SQL_CHAR, CITY_LEN, 0, szData, 0, cbValue);

SQLPrepare(hstmt, "INSERT INTO CITIES VALUES (?)", SQL_NTS);

SQLParamOptions(hstmt, 5, &irow);

while (TRUE) {

            retcode = SQLExecute(hstmt);

            if (retcode != SQL_ERROR) {

                        break;

            }

            /* При ошибке, напечатать ее. Если ошибка в 1 строке, откатить транзакцию и выйти. Если ошибка в другой строке, завершить транзакцию, и, несмотря на ощибку перейти к работе со следующим значения параметра */

            show_error();

            if (irow == 1) {

                        SQLTransact(henv, hstmt, SQL_ROLLBACK);

                        break;

            } else {

SQLTransact(henv, hstmt, SQL_COMMIT);

                        if (irow == 5) {

                                   break;

                        } else {

                                   SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_DEFAULT, SQL_CHAR, CITY_LEN, 0, szData[irow], 0, cbValue[irow]);

                                   SQLParamOptions(hstmt, 5-irow, &irow);

                        }

            }

}

 

1.1.4.6.SQLParamData и SQLPutData

 

SQLParamData используется совместно с SQLPutData для определениязна­че­ний параметров во время выполнения оператора.

Прототип:

RETCODE SQLParamData(

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

  PTR FAR *prgbValue // Указатель области хранения значения

             // которое было определено для аргумента rgbValue

             // в SQLBindParameter (для значений параметров)

             // или адрес буфера rgbValue, определенный в SQLBindCol

             // (для значения столбца

);

 

SQLPutData позволяет прикладной программе  передавать  данные(сим­воль­ные,  двоичные или специфические) в качестве значения параметра или от­дельного столбца во время выполнения оператора.

Прототип:

RETCODE SQLPutData(

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

  PTR rgbValue, // Указатель области хранения значений параметра

                // или столбца. Данные должны быть представлены

                // в формате fCType, определенном функцией

                // SQLBindParameter или SQLBindCol

  SDWORD cbValue // длина rgbValue. Определяет объем данных,

                 // которые посылаются при вызове SQLPutData

);

В следующем примере приложение  подготавливает  SQL  оператордля вы­пол­­не­ния вставки в таблицу EMPLOYEE.  Оператор содержит параметры для по­лей NAME, ID, PHOTO. Для каждого параметра приложение  вызывает SQL­Bind­Parameter для определения данных Си и SQL параметра.

Указывается также,   что   данные   для  первого  и  третьегопараметра бу­дут переда­ны во время исполнения оператора и передаетзначения  1 и 3  для  от­сроченной  вы­бор­ки  данных  с помощью SQLParamData. Эти значения иден­тифицируют параметр, который будет обрабатываться.  Приложение вызывает функцию GetNextID, чтобы по­лу­чить очередной номер служащего.  Затем оно вызывает SQLExecute, которое воз­вратит SQL_NEED_DATA, когда ему потре­буются данные для первого и третьего пара­метров. Приложение вызовет SQLParamData и извлечет  значение, которое было туда   помещено  функцией SQLBindParameter;  оно использует это значение,  чтобы опреде­лить какому па­ра­метру послать значение.

Для каждого параметра приложение вызывает InitUserData, чтобы иници­иро­вать под­про­грамму,  возвращающую данные.  Затем повторно вызывает Get­UserData и SQLPutData для того, чтобы получить и послать значение пара­мет­ра.  В конце концов вызывается SQLParamData, чтобы индицировать,  что все данные для параметра пос­ланы и  сделать выборку значения для следу­ю­ще­го параметра.  После того,  как данные будут пересланы для всех параметров,  SQLParamData  вернет SQL_SUCCESS.

Для первого  параметра  InitUserData  ничего  не  делает, а GetUserData вызывает подпрограмму для ввода имени служащего.

Для третьего параметра InitUserData вызывает подпрограмму для  ввода  имени файла,  содержащего фотографию служащего и открывает этот файл. GetUserData читает по MAX_DATA_LEN байт из этого файла за раз. После того, как весь файл будет прочитан, он закрывается.

Заметим,  что некоторые прикладные подпрограммы в тексте опущены.

 

#define NAME_LEN 30

#define MAX_DATA_LEN 1024

SDWORD  cbNameParam, cbID = 0; cbPhotoParam, cbData;

SWORD   sID;

PTR     pToken, InitValue;

UCHAR   Data[MAX_DATA_LEN];

 

retcode = SQLPrepare(hstmt, "INSERT INTO EMPLOYEE "

 " (NAME, ID, PHOTO) VALUES (?, ?, ?)", SQL_NTS);

if (retcode == SQL_SUCCESS) {

 

/* Связывание параметров. Для параметров 1 и 3, передается номер */

/* параметра в rgbValue вместо фдреса буфера. */

 

SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,

  NAME_LEN, 0, 1, 0, &cbNameParam);

SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT,

  SQL_SMALLINT, 0, 0, &sID, 0, &cbID);

SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY,

  SQL_LONGVARBINARY, 0, 0, 3, 0, &cbPhotoParam);

 

/* Установить значения, чтобы параметры 1 и 3 были переданы   */

/* во время исполнения оператора. Отметим, что длина параметров */

/* макро SQL_LEN_DATA_AT_EXEC is 0. Это подразумевает, что */

/* драйвер возвращает "N" для SQL_NEED_LONG_DATA_LEN - типа данных */

/* в SQLGetInfo.  */

 

cbNameParam = cbPhotoParam = SQL_LEN_DATA_AT_EXEC(0);

sID=GetNextID(); /* Получить следующий свободный номер служащего */

retcode = SQLExecute(hstmt);

 

/* Для параметров,  значения которых определяются во время */

/* исполнения, вызываем SQLParamData, чтобы получить номер */

/* параметра, установленный SQLBindParameter. Вызываем */

/* InitUserData. Вызываем GetUserData и SQLPutData неоднократно, */

/* чтобы получить и передать всю информацию о параметре. */

/* Вызываеи SQLParamData, чтобы закончить обработку */

/* текущего параметра и начать обрабатывать следующий параметр. */

 

while (retcode == SQL_NEED_DATA) {

    retcode = SQLParamData(hstmt, &pToken);

    if (retcode == SQL_NEED_DATA) {

        InitUserData((SWORD)pToken, InitValue);

        while (GetUserData(InitValue, (SWORD)pToken, Data, &cbData))

            SQLPutData(hstmt, Data, cbData);

    }

}

}

 

//===========================================

VOID InitUserData(SWORD sParam, PTR InitValue) {

UCHAR  szPhotoFile[MAX_FILE_NAME_LEN];

switch sParam {

    case 3:

        /* Запросить у пользователя имя файла, содержащего фото */

        PromptPhotoFileName(szPhotoFile);

        /* открыть файл

        OpenPhotoFile(szPhotoFile, (FILE *)InitValue);

        break;

}

}

 

//=============================================

BOOL GetUserData(PTR InitValue, SWORD sParam,

  UCHAR *Data, SWORD *cbData) {

 

switch sParam {

case 1:

    /* Запрос имени служащего */

    PromptEmployeeName(Data);

    *cbData = SQL_NTS;

    return (TRUE);

 

case 3:

    /* GetNextPhotoData считывает следующий кусочек фотографии и */

    /* получает число прочитанных байт (до MAX_DATA_LEN). */

    Done = GetNextPhotoData((FILE *)InitValue, Data,

      MAX_DATA_LEN, &cbData);

    if (Done) {

        ClosePhotoFile((FILE *)InitValue);

        return (TRUE);

    }

    return (FALSE);

}

return (FALSE);

}


1.1.5.    Асинхронное выполнение

 

            Иногда для выполнения SQL-оператора может потребоваться значитель­ное время. Как только такой оператор передается на сервер, то по умолчанию ODBC будет ждать пока не кончится выполнение оператора на сервере. Если поль­зо­ва­тель хочет, чтобы его компьютер в это время занялся чем-нибудь по­лезным, то для этого существует возможность асинхронного выполнения  SQL-оператора. Про­грамма сначала должна вызвать SQLSetConnectOption или SQLSet­Statement­Option и установить fOptionSQL_ASINC_ENABLE в TRUE. Установка опции сое­динения разрешает асинхронное выполнение всех опера­торов для этого сое­ди­нения. Установка опции оператора разрешает асин­хрон­ное выполнение только для этого оператора. Далее можно вызвать любую фун­кцию, поддерживающую асин­хронное выполнение. Функция будет возвращать SQL_STILL_EXECUTING пока не закончится ее выполнение.

            Чтобы выяснить закончилось ли выполнение функции, программа повтор­но ее вызывает. Если с тем же идентификатором оператора вызывается любая дру­гая функция, кроме SQLCancel, то возвращается SQL_ERROR. Программа мо­­жет прекратить выполнение функции с помощью SQLCancel.

            Прототип SQLSetConnectOption имеет вид:

RETCODE  SQLSetConnectOption (

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

   UWORD  fOption,  // опция, которую следует установить

   UDWORD vParam  // Устанавливаемое значение. В зависимости от fOption                             

                                   //  может быть 32-битовым целым или указателем на

                                   //  строку, заканчивающуюся нулем.

);

Некоторые возможные значения fOption и соответствующие им значения  vParam приведены ниже.

fOption=SQL_ASYNC_ENABLEvParam может принимать значения SQL_ASYNC_ENABLE_ON и SQL_ASYNC_ENABLE_OFF. Умолчание - SQL_ASYNC_ENABLE_OFF. Если некоторая функция вызвана для асин­хрон­ного выполнения, то никакая другая функция, кроме SQLAllocStmt, SQLCancel, или SQLGetFunctions не может быть вызвана для того же оператора или соеди­не­ния до тех пор, пока асинхронно выполняемая функция не вернет что-то от­лич­­ное от SQL_STILL_EXECUTING. Если это все же будет сделано, то вызван­ная функция будет возвращать SQL_ERROR.

            Следующие функции могут быть вызваны асинхронно:

SQLColAttributes                         SQLColumnPrivileges

SQLColumns                                 SQLDescribeCol

SQLDescribeParam                       SQLExecDirect

SQLExecute                                   SQLExtendedFetch

SQLFetch                                      SQLForeignKeys

SQLGetData                                  SQLGetTypeInfo

SQLMoreResults                            SQLNumParams

SQLNumResultCols                      SQLParamData

SQLPrepare                                   SQLPrimaryKeys

SQLProcedureColumns                 SQLProcedures

SQLPutData                                   SQLSetPos

SQLSpecialColumns                      SQLStatistics

SQLTablePrivileges                       SQLTables

 

fOption=SQL_ACCESS_MODE.          vParam может принимать значения SQL_MODE_READ_ONLY   и  SQL_MODE_READ_WRITE. Первое означает, что оператор не намерен модифицировать данные в базе. Умолчанием является SQL_MODE_READ_WRITE.

FOption=SQL_AUTOCOMMIT.    vParam  может принимать значения

SQL_AUTOCOMMIT_ON и SQL_AUTOCOMMIT_OFF. В первом случае буферы

сбрасываются немедленно по исполнении оператора.

            Другие значения fOption будут рассмотрены в связи с транзакциями.

            Функция SQLSetStmtOption имеет такие же параметры.

 

1.1.6.    Скалярные функции

 

            В SQL-операторах  могут быть использованы скалярные функции. Форма их включения в SQL-оператор имеет вид

                            { fn <имя функции>(аргументы)}, например:

                          select something, {fn UCASE(fname)} from my_table

Функции делятся на пять групп. Каждая группа имеет fInfoType для функции SQLGetInfo:

   Строковые функции                      SQL_STRING_FUNCTIONS

   Числовые функции                        SQL_NUMERIC_FUNCTIONS

   Функции времени и даты             SQL_TIMEDATE_FUNCTIONS

   Функции преобразования типа    SQL_CONVERT_FUNCTIONS

SQLGetInfo возвращает 32-битовую маску, которая перечисляет все поддержи­ва­е­мые функции.

К строковым функциям относятся:

CONCAT, LEFT, LTRIM, LENGTH, LOCATE, LCASE, RIGHT, RTRIM, SUBSTRING, UCASE, ASCII, CHAR, SPACE.

Числовые функции -

ABS, ATAN, CEILING, COS, EXP, FLOOR, LOG, MOD, SIGN, SIN, SQRT, TAN, RAND, POWER.

Функции времени и даты -

NOW, CURDATE, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, MONTH, WEEK, YEAR, CURTIME, HOUR, MINUTE, SECOND.

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

Функции преобразования типов данных - существует только одна такая функ­ция - CONVERT. Функция CONVERT имеет два параметра: value_exp и data_type. Параметр value_exp может быть строковым или числовым литералом, именем столбца или результатом другой скалярной функции. Data-type - это SQL-тип, в который вы хотите преобразовать value_exp.

Пример преобразо­вы­вает номер телефона в символьный вид, после этого он может быть исполь­зо­ван в предикате LIKE:

select name, phone from klient where {fn CONVERT(phone, SQL_CHAR)} like ‘33%’


1.1.7.    Типы данных: время, дата и временные метки

            Несмотря на то, что указанные типы форматируются различно для различных баз данных, escape - фразы ODBC обеспечивают общий формат.

Дата представляется в виде:   {d’yyyy-mm-dd’}; время : {t’hh:mm:ss}, а временная метка (timestamp) : {ts’yyyy-mm-dd hh:mm:ss[.f...]}, где f - доли секунд.

Например:

            insert into first_table (datecol) values ({d‘1997-11-23’})

            select * from another_table where timecol > ({t’11:45:09’})

            delete from third_table where tscol < {ts’1996-11-24 11:45:25.67’}


1.1.8.    Выборка  информации о результате запроса.

1.1.8.1. SQLNumResultCols

 

    Функция возвращает число столбцов запроса. Прототип:

RETCODE SQLNumResultCols(

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

    SWORD FAR *pccol // указатель на возвращаемое число столбцов.

);

Функция возвращает 0 для всех операторов,  кроме SELECT и вызова процедур.



Популярные новости

Статистика сайта



Rambler's Top100



 
Copyright © НеОфициальный сайт факультета ЭиП