|
Программирование >> Sql: полное руководство
3. Профамма вызывает функцию dbbxnd () по одному разу для каждого столбца из таблицы результатов запроса, сообщая библиотеке DB-Library, куда она должна возвращать данные каждого отдельного столбца. Аргументы функции dbbind() указывают номер столбца, ожидаемый тип данных, размер буфера для приема данных и адрес буфера. 4. Профамма выполняет цикл, многократно вызывая функцию dbnextrow () для получения строк из таблицы результатов запроса. Библиотека DB-Library помешает возвращаемые данные в буферы, указанные в предшествующих вызовах функции dbbmd (). 5. Когда все строки будут получены, функция dbnextrow () возвратит значение n0 more rows. Если В пакете за инсфукцией select следуют другие инструкции, профамма может вызвать функцию dbresults (), чтобы перейти к следующей инсфукции. maxn() LOGINREC *Iogxnrec; /* структура данных для хранения регистрационной информации */ DBPROCESS *dbproc; /* структура данных, описывающая соединение */ char repname[16]; /* полученное имя служащего*/ short repquota; /* полученный личный план служащего */ float repsales; /* полученный объем продаж служащего */ /* Подключиться к SQL Server */ loginrec = dbIogin(); DBSETLUSER(Ioginrec, scott ), DBSETLPWD (loginrec, tiger ) dbproc = dbopen(loginrec, ) /* Передать запрос в DB-Library и дать команду SQL Server выполнить запрос */ dbcmd(dbproc, select name, quota, sales from salesreps ), dbcmd (dbproc, where sales > quota order by name ) ;-----, dbsqlexec(dbproc);M-Q /* Узнать, как была выполнена первая инструкция из пакета */ dbresults (dbproc) ; -@ /* Связать каждый столбец с переменной программы */ dbbind(dbproc, 1, NTBSTRINGBIND, 16, repname dbbind (dbproc, 2, FLT4BIND, 0, Srepquota) ;- -@ dbbind(dbproc, 3, FLT4BIND, 0, Srepsales); <--~~ f* Цикл выборки строк из таблицы результатов запроса */ while (status = dbnextrow(dbproc) == SUCCEED) (-® /* Вывести на экран информацию о данном служащем */ printf( Имя: %s\n , repname); printf( План: %f\n\n , repquota); printf( Объем продаж: %f\n , repsales); /* Проверить ошибки и закрыть соединение */----© If (status == FAIL) { printf( Ошибка SQL.\n ); dbexit(dbproc) ; exit(O) ; с. 7 p. 7. Получение результатов запроса в SQL Server Обработка таблицы результатов запроса в рассматриваемой профамме (рис. 19.7) осуществляется с помощью двух функций библиотеки DB-Library: dbbmdo и dbnextrowO. Функция dbbmdO устанавливает соответствие между столбцами таблицы результатов запроса и профаммными переменными, принимающими извлекаемые данные. Этот процесс называется привязкой столбцов. Первый столбец name, привязывается к массиву из 1б-ти символов и будет возвращен в виде Сфоки оканчивающейся нулевым символом. Второй и фетий столбцы, quota и sales привязываются к числовым переменным. Обязанность профаммиста - обеспечить чтобы тип данных каждого столбца был совместим с типом данных программно! переменной, к которой он привЗзывается. И вновь будет полезно срав!ить обработку запроса в SQL Server (рис 19.7) с обработкой запроса во встроенном SQL (рис. 17.20 и 17 23): Во встроенном SQL существует два метода обработки запросов: один для запросов, возвращающих отдельную запись (одиночная инструкция select), а другой для запросов, возвращающих наборы записей. В SQL Server используется единый метод, независимо от количества строк в таблице результатов запроса. Во всфоенном SQL запрос выражается в виде либо одиночной инсфукции select, либо инструкции declare cursor, которые отличаются от интерактивной инструкции select для данного запроса. В SQL Server инструкция select, посылаемая профаммой, идентична интерактивной инсфукции select для данного запроса. Во встроенном SQL базовые переменные, принимающие результаты запроса, задаются в предложении into одиночной инсфукции select или инсфукции fetch, в случае с SQL Server соответствующие профаммные переменные задаются в функции dbbmd (). Во встроенном SQL посфочный доступ к таблице результатов запроса обеспечивается с помощью специально предназначенных для этой цели инсфукций SQL (open, fetch и close) в SQL Server доступ к таблице результатов запроса осуществляется посредством функций библиотеки DB-Library: dbresults () и dbnextrow() В связи с относительной простотой интерфейса, применяемого в SQL Server, и его сходством с интерактивным SQL многие профаммисты считают, что АР! в SQL Server более удобен для обработки запросов, чем встроенный SQL. Выборка значений NULL \ Функции dbnextrowO и dbbindO, представленные на рис. 19.7, обеспечивают простой способ получения результатов запроса, но они не позволяют извлекать значения null. Если СфОка, извлекаемая функцией dbnextrow (), содержит столбец со значением null, SQL Server подставляет вместо него замещающее значение. По умолчанию замещающим значением в SQL Server для числовых типов данных является нуль, для сфок фиксированной длины - строка пробелов, а для сфок переменной длины - пустая Сфока. Приложение может изменить принимаемое по умолчанию замещающее значение для любого типа данных с помощью API-функции dbsetnull (). Если в рассматриваемой профамме (рис. 19.7) одна из строк таблицы содержит значение null в столбце quota, функция dbnextrowO для этой строки запишет нуль в переменную repquota. Обратите внимание на то, что по извлекаемым данным профамма не может определить, действительно ли столбец quota содержит нуль или в нем находится значение null. В одних приложениях применение замещаюших значений вполне приемлемо, но в других возможность обнаруживать значения null является очень важной. В последнем случае следует использовать альтернативную схему извлечения результатов запроса, описанную в следующем парафафе. Извлечение результатов запроса с помощью указателей При стандартном методе извлечения данных из SQL Server функция dbnextrow () копирует содержимое каждого столбца в одну из переменных профаммы. Если в таблице результатов запроса имеется много сфок или много длинных столбцов с текстовыми данными, процесс копирования может занять много времени. Кроме того, функция dbnextrow () не имеет механизма передачи в профамму значений null Для рещения двух указанных проблем в библиотеке DB-Library применяется альтернативный метод извлечения результатов запроса. На рис. 19.8 приведена та же профамма, что и на рис. 19.7, но переписанная с использованием альтернативного метода: 1. Программа посылает запрос в SQL Server и использует функцию dbresults () для доступа к результатам запроса (как и в случае с любой инструкцией SQL). Однако профамма не вызывает функцию dbbmd () для привязки столбцов к профаммным переменным. 2 Профамма вызывает функцию dbnextrow () и последовательно перемещается по таблице результатов запроса от одной сфоки к другой. 3 Для каждого столбца каждой сфоки профамма вызывает функцию dbdata (), чтобы получить указатель на значение очередной ячейки. Указатель адресует местоположение содержимого ячейки во внуфенних областях памяги библиотеки DB-Library. 4. Если столбец содержит данные переменной длины (тип varchar), профамма вызывает функцию dbdatlen (), чтобы узнать длину элемента данных. 5 Если столбец содержит значение null, функция dbdata () возвращает нулевой указатель (0), а функция dbdatlen () возвращает нулевую длину элемента данных. Это позволяет профамме обнаружить значения null и отреагировать надлежащим образом. mam () ( LOGINREC *loginrec; /* структура данных для хранения регистрационной информации */ DBPROCESS *dbproc; /* структура данных, описывающая соединение */ char *namep; /* указатель на данные столбца НАМЕ */ namelen; /* длина данных столбца NAME */ float *quotap; /* указатель на данные столбца QUOTA */ float *salesp,- /* указатель на данные столбца SALES */ /* Подключиться к SQL Server */ loginrec = dblogin(); DBSETLUSERdogmrec, scott ), DBSETLPWD (loginrec, tiger ), dbproc = dbopen(loginrec, ), /* Передать запрос в библиотеку DB-Library и дать команду SQL Server выполнить запоос */ нс. 19,8. Выборка данных с использованием функции dbdata ()
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |