Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009
.pdf16. Интерфейсы программирования Web-приложения |
633 |
При успешном завершении функция SQLAIIocHandle() возвращает зна-
чение S Q L _ S U C C E S S |
или S Q L _ S U C C E S S _ W I T H _ I N F O ; при аварийном за- |
вершении - значение S Q L I N V A L I D H A N D L E или S Q L _ E R R O R . |
|
Для установления |
параметров среды исполнения используется функция |
SQLSetEnvAttr(): |
|
e r r = S Q L S e t E n v A t t r ( s q l _ h e n v , S Q L _ A T T R _ O D B C _ V E R S I O N , ( S Q L P O I N T E R ) S Q L _ O V _ O D B C 3 , S Q L _ I S _ I N T E G E R ) ;
Здесь параметры функции задают следующее:
•идентификатор среды, для которой выполняется настройка атрибутов;
• тип редактируемого атрибута (значение S Q L _ A T T R _ O D B C _ V E R S I O N указывает версию драйвера ODBC);
•значение атрибута (для численных значений) или адрес строки атрибута (для атрибутов, заданных в виде текстовой строки);
•тип значения атрибута или длину строки в зависимости от значения
третьего параметра (числовое либо строчное соответственно). Далее в приложении выполняется инициализация среды соединения:
e r r = S Q L A I I o c H a n d l e ( S Q L _ H A N D L E _ D B C , s q l _ h e n v , & s q l _ h d b c ) ;
Переменной sql hdbc присваивается идентификатор соединения, имеющий тип S Q L _ H A N D L E _ D B C и создаваемый в контексте идентификатора среды, хранящегося в переменной sql_henv.
Установка соединения с источником данных с использованием имени DSN
выполняется с помощью функции SQLConnect():
e r r = S Q L C o n n e c t ( s q l _ h d b c ,
s y s _ D S N , ( S W O R D ) s t r l e n ( ( c o n s t c h a r * ) s y s _ D S N ) ,
u s e r _ N a m e , ( S W O R D ) s t r l e n ( ( c o n s t c h a r * ) u s e r _ N a m e ) ,
u s e r _ P a s s w o r d , ( S W O R D ) s t r l e n ( ( c o n s t c h a r * ) u s e r _ P a s s w o r d ) ) ;
Используемые при вызове функции переменные определены следующим образом:
U C H A R s y s _ D S N [ S Q L _ M A X _ D S N _ L E N G T H + 1] = " A u t h o r s " ;
U C H A R |
u s e r _ N a m e [ M A X N A M E ] = " " ; |
U C H A R |
u s e r _ P a s s w o r d [ M A X N A M E ] = " " ; |
После установления соединения можно задавать запросы по извлечению данных с помощью команд языка SQL.Для выполнения команды на языке SQL
нужно получить идентификатор команды, хранящийся в переменной sql_hstmt, с помощью функции SQLAIIocHandleQ:
e r r = S Q L A I I o c H a n d l e ( S Q L _ H A N D L E _ S T M T , s q l _ h d b c , & s q l _ h s t m t ) ;
634 Часть 4. Публикация баз данных в Интернете
Команда на SQL задается с помощью вызова функции S Q L E x e c D i r e c t Q , например:
e r r = S Q L E x e c D i r e c t ( s q l _ h s t m t , ( u n s i g n e d c h a r * ) " s e l e c t * f r o m A u t h o r s " , S Q L _ N T S ) ;
Здесь для идентификатора команды, хранящегося в переменной sql_hstmt, запускается на выполнение команда SQL " s e l e c t * f r o m A u t h o r s " , выбирающая все поля в таблице A u t h o r s . В этой функции последний аргумент указывает длину строки второго аргумента (SQL-команды), а константа S Q L _ N T S указывает, что длина строки определяется закрывающим ее двоичным нулем.
В случае успешного выполнения команды CGI-модуль получает набор данных из БД. Для извлечения записей из этого набора данных используется
функция S Q L B i n d C o l ( ) , выполняющая связывание указателя на строку символов, хранящегося в переменной id, со значением поля текущей записи:
e r r = S Q L B i n d C o l ( s q l _ h s t m t , 1, S Q L _ C _ C H A R , id, 3 0 , & l i d ) ;
Переменные id и lid определены следующим образом:
S Q L C H A R i d [ 3 0 ] ;
S Q L I N T E G E R lid;
При этом второй параметр функции определяет номер столбца набора данных. Следующие два параметра определяют тип и адрес переменной, которая связывается с полем текущей записи набора данных. Пятый параметр задает максимальный размер связанной переменной. Последний параметр задает адрес переменной, которой присваивается длина данных, извлекаемых функцией SQLFetch():
w h i l e ( ( e r r = S Q L F e t c h ( s q l _ h s t m t ) ) != S Q L _ N O _ D A T A )
{
p r i n t f ( " < T R X T D > % 1 5 s < 7 T D X T D > % 2 5 s < / T D X T D > % 1 0 s
< / T D > < / T R > " , i d , n a m e , y e a r ) ;
}
Здесь функция S Q L F e t c h ( ) выполняет извлечение очередной записи набора данных. При достижении конца записей она возвращает значение константы S Q L _ N O _ D A T A . Значение соответствующего поля можно получить путем обращения к связанным переменным внутри цикла.
Для просмотра результатов работы CGI-модуля удобно воспользоваться обозревателем. Для этого нужно создать простейший НТМ L-документ, содержащий следующую ссылку
< A h r e f = " h t t p : / / l o c a l h o s t / s c r i p t s / o d . e x e " >
З а г р у з и т ь C G I - м о д у л ь п о з а п р о с у h t t p : / / l o c a l h o s t / S c r i p t s / o d . e x e < / A >
16. Интерфейсы программирования Web-приложения |
635 |
Далее нужно откомпилировать CGI-модуль, для чего в оболочке Visual С++6.0 или 5.0 открыть с помощью соответствующего Мастера новое консольное приложение, назвав его "od". Затем перенести в файл "od.cpp" приведенный выше код примера на С++ и откомпилировать его. После успешной компиляции нужно скопировать файл "od.exe" в каталог, где хранятся сценарии (в зависимости от того, под управлением какого сервера предполагается запускать модуль, например для Personal Web Server -"C:\WebShare\Scripts\ для MIIS - "C:\InetPub\Scripts\").
Кроме того, следует установить параметры DSN для имени A u t h o r s . Для этого в администраторе ODBC нужно создать новое пользовательское имя DSN — "Authors". Причем в настройке параметров этого имени связать этот DSN с демонстрационной БД MS Access, входящей в состав дистрибутива Windows 2000 Server, Authors.mdb и находящейся в каталоге C:\Inetpub\iissamples\SDK\ASP\DATABASE (рис. 16.3).
У с т а н о в к а д р а й в е р а |
ODBC для Microsoft A c c e s s |
ш |
|
Имя источника данных: [j |
0К |
||
Описание: |
|
|
Отмена |
- База данных |
|
|
|
|
|
|
|
База данных: |
c:Y. ASDK\ASP\DATABASE\Authors.mdb |
Справка |
|
Выбрать... |
| |
Создать... j Восстановить... j |
Рцать... j |
|
|
|
Дополнительно... |
Системная база данных
Нет
С База данных:
Ьистемная Оаза данных.
Параметры>>
Рис. 16.3. Окно настройки пользовательского DSN администратора ODBC
При необходимости можно создать собственную БД MS Access или другого типа, установив связь с БД с именем DSN описанным выше способом. При этом для соответствия с логикой работы данной программы в БД должно быть не менее трех колонок с такими же именами.
Для получения результата достаточно загрузить приведенный выше HTML-документ в обозреватель и выбрать в нем единственную ссылку. Результат работы модуля "od.exe" приведен на рис. 16.4.
636 |
Часть 4. Публикация баз данных в Интернете |
5 MY TEST - Microsoft Internet Exploier |
|7~|iT< |
http: //localhost/scripts/od. exe
|
Information from DataBase |
|
|
|
|
—•——} |
1 |
|
|
|
|
Price |
i |
|
i |
|
|
|
Name |
ii |
Year j |
|
|
|
|
|
|
i |
|
|
|
\i |
|
i |
|
7 3 |
Scott Guthrie |
1975 |
j |
|
|
|
|
j |
|
|
|
114 |
Shammas, Namir Clement |
' 1 9 5 4 |
|
|
|
|
i |
j |
|
|
|
|
|
! |
|
|
'i |
2 4 4 |
Vaughn, William |
j |
1 9 4 7 |
1! |
о |
611 |
Bard, Dick |
|
1 9 4 1 |
|
•SI |
|
|
|
|
|
Рис. 16.4. Окно обозревателя с результатом работы модуля "od.exe"
Программа "od.exe" выводит в окно обозревателя содержимое БД "Authors.mdb" в виде таблицы, занимающей всю область окна обозревателя. Причем основное пространство в окне выделено во второй колонке таблицы, что определяется параметром Width=100% заданного для второй ячейки в строке заголовка таблицы.
В частности, в рассматриваемой программе заголовочные теги таблицы выводятся с помощью следующего кода:
printf("<Table W i d t h = ' 1 0 0 % s ' C e l l S p a c i n g = 1 0 C e l l P a d d i n g = 10 B o r d e r = 3 > ' \ d ) ; p r i n t f ( " < C a p t i o n a l i g n = C e n t e r > l n f o r m a t i o n f r o m D a t a B a s e < / C a p t i o n > " ) ; p r i n t f ( " < T R > < T H > Id C / T H X T H W i d t h = 1 0 0 % s > N a m e < / T H X T H > Y e a r < / T H X / T R > " , d ) ;
Далее в программе идет код вывода строк таблицы.
Освобождение памяти, выделенной для размещения служебных (системных)
переменных, в программе выполняется с помощью функции
16. Интерфейсы программирования |
Web-приложения |
637 |
Публикация |
БД с использованием |
ADO |
ADO является интерфейсом высокого уровня, объединяющим модель объектов для доступа к различным источникам данных на основе использования интерфейса OLE DB. Напомним, что универсальный доступ к различ- ным источникам данных обеспечивается механизмом OLE DB-провайдеров.
При этом приложения, использующие интерфейс OLE DB, могут использовать функции провайдера и потребителя данных.
Основные элементы интерфейса OLE DB составляет набор СОМ-объек- тов, используемых для установки соединения с базами данных, выполнения команд выборки данных, обработки результатов выполнения этих команд и возникших ошибок.
Рассмотрим основные особенности использования интерфейса ADO для доступа к ODBC-источникам данных (база данных в формате MS Access).
В основе интерфейса ADO лежат принципы, заложенные в объектной модели СОМ, в которой для получения доступа к данным используются объекты, наделенные свойствами и методами для управления свойствами. В модели ADO реализован набор объектов для установки соединения с источником данных, объекты для выборки необходимых данных (выполнения команд на языке Transact-SQL — версия языка SQL, поддерживаемая фирмой Micrisoft), обработки результатов выборки данных и обработки ошибок. Интерфейс ADO предназначен для использования в Интернете для универсального доступа (в том числе удаленного доступа) к различным источникам данных с неизвестной внутренней структурой.
Иерархия объектов интерфейса ADO приведена на рис. 16.5.
Рис. 16.5. Иерархия объектов интерфейса ADO
638 Часть 4. Публикация баз данных в Интернете
Дадим краткую характеристику основным объектам модели ADO. Объект C o n n e c t i o n используется для установки соединения с источником данных. В рассмотренном ниже примере будет использовано соединение с БД с помощью интерфейса ODBC. В этом случае указывается имя DSN, имя пользователя и пароль. Для объекта C o n n e c t i o n создаются связанные с ним объек-
т ы C o m m a n d , R e c o r d S e t , Errors .
Объект Command используется для выполнения команды на языке Transact-SQL для источника данных, доступ к которому открыт с помощью объекта C o n n e c t i o n . С объектом C o m m a n d могут быть связаны один или несколько объектов P a r a m e t e r s , содержащих объекты P a r a m e t e r , используемые для передачи параметров выполнения команд.
Объект R e c o r d S e t содержит данные, полученные в результате выполнения команд выборки данных. Объект R e c o r d S e t содержит набор объектов — Fields, представляющий собой совокупность объектов Field, которые и содержат данные.
В случае возникновения ошибок при выполнении команд создается объект E r r o r , который помещается в набор объектов E r r o r s .
Пример 1. Использование объектов ADO. Рассмотрим порядок использования объектов ADO на примере следующего модуля CGI, осуществляющего доступ к БД в формате MS Access через провайдера ODBC:
/ / З а г о л о в о ч н ы е ф а й л ы
# i n c l u d e " s t d a f x . h "
# i n c l u d e < i n i t g u i d . h >
# i n c l u d e < a d o i d . h >
# i n c l u d e < a d o i n t . h > u s i n g n a m e s p a c e s t d ;
v o i d m a i n ( v o i d )
{
/ / И н и ц и а л и з а ц и я с и с т е м ы C O M C o l n i t i a l i z e ( N U L L ) ;
/ / И н и ц и а л и з а ц и я с л у ж е б н ы х с т р о к о в ы х п е р е м е н н ы х C S t r i n g c s F o r C o n n e c t ( " D S N = A u t h o r s ; U I D = ; P W D = ; " ); C S t r i n g c s E m p t y ( " " ) ;
C S t r i n g c s F o r C o m m a n d ( " s e l e c t * f r o m A u t h o r s " ) ;
/ / И н и ц и а л и з а ц и я с л у ж е б н ы х п е р е м е н н ы х к л а с с а B S T R , / / п р е д н а з н а ч е н н о г о д л я х р а н е н и я с п е ц и а л ь н ы х с т р о к B S T R b s F o r C o n n e c t = c s F o r C o n n e c t . A l l o c S y s S t r i n g ( ) ;
B S T R b s E m p t y = c s E m p t y . A l l o c S y s S t r i n g ( ) ;
B S T R b s F o r C o m m a n d = c s F o r C o m m a n d . A l l o c S y s S t r i n g ( ) ;
/ / И н и ц и а л и з а ц и я с л у ж е б н ы х п е р е м е н н ы х к л а с с а V A R I A N T V A R I A N T v E m p t y ;
V A R I A N T v E m p t y T o o ;
v E m p t y . v t = V T E R R O R ;
640 Часть 4. Публикация баз данных в Интернете
i f ( S U C C E E D E D ( h r e s _ o k ) )
h r e s _ o k = r e s - > g e t _ E O F ( & a d o _ E O F ) ;
/ / И н и ц и а л и з а ц и я п е р е м е н н ы х д л я х р а н е н и я у к а з а т е л е й н а о б ъ е к т ы F i e l d s и Field
A D O F i e l d s * a d o F i e l d s = N U L L ; |
|
A D O F i e l d * |
id = N U L L ; |
A D O F i e l d * |
n a m e = N U L L ; |
A D O F i e l d * y e a r B o r n = N U L L ; |
|
/ / Г е н е р а ц и я з а г о л о в к а H T M L - д о к у м е н т а |
|
s . F o r m a t ( " C o n t e n t - t y p e : t e x t / h t m l % c % c " , 1 0 , 1 0 ) ; |
|
c o u t « ( L P C T S T R ) s « " \ n " ; |
c o u t « " < H T M L X H E A D X T I T L E > M Y T E S T C / T I T L E X / H E A D > < B O D Y > " ; / / Г е н е р а ц и я з а г о л о в к а т а б л и ц ы
c o u t « " C T a b l e W i d t h = ' 1 0 0 % ' C e l l S p a c i n g = 1 0 C e l l P a d d i n g = 1 0 B o r d e r = 3 > " ; c o u t < < " < C a p t i o n a l i g n = C e n t e r > l n f o r m a t i o n f r o m D a t a B a s e < / C a p t i o n > " ; c o u t < < " < T R X T H > Id c / T H X T H W i d t h = 1 0 0 % > N a m e of a u t h o r s < A H >
< T H > Y e a r B o r n < / T H X / T R > " ;
/ / Ц и к л п о к о л и ч е с т в у з а п и с е й в н а б о р е д а н н ы х
w h i l e ( a d o _ E O F = = V A R I A N T _ F A L S E )
{
/ / И з в л е ч е н и е у к а з а т е л я н а о б ъ е к т F i e l d s д л я т е к у щ е й з а п и с и
h r e s _ o k = r e s - > g e t _ F i e l d s ( & a d o F i e l d s ) ; |
|
|
i f ( ! S U C C E E D E D ( h r e s _ o k ) ) b r e a k ; |
|
|
/ / И з в л е ч е н и е у к а з а т е л е й |
н а о б ъ е к т ы Field д л я о б ъ е к т а |
F i e l d s |
h r e s _ o k = a d o F i e l d s - > g e t _ l t e m ( C O I e V a r i a n t ( " A u _ I D " ) , & i d ) ; |
||
i f ( ! S U C C E E D E D ( h r e s _ o k ) ) b r e a k ; |
|
|
h r e s _ o k = a d o F i e l d s - > g e t _ l t e m ( C O I e V a r i a n t ( " a u t h o r " ) ( |
& n a m e ) ; |
|
i f ( ! S U C C E E D E D ( h r e s _ o k ) ) b r e a k ; |
|
|
h r e s _ o k = a d o F i e l d s - > g e t _ l t e m ( C O I e V a r i a n t ( " Y e a r B o m " ) , & y e a r B o r n ) ; |
||
i f ( ! S U C C E E D E D ( h r e s _ o k ) ) b r e a k ; |
|
|
/ / И з в л е ч е н и е д а н н ы х |
|
|
h r e s _ o k = n a m e - > g e t _ V a l u e ( & s _ n a m e ) ; |
|
|
i f ( ! S U C C E E D E D ( h r e s _ o k ) ) b r e a k ; |
|
|
h r e s _ o k = y e a r B o r n - > g e t _ V a l u e ( & s _ y e a r B o r n ) ; |
|
|
i f ( ! S U C C E E D E D ( h r e s _ o k ) ) b r e a k ; |
|
|
h r e s _ o k = i d - > g e t _ V a l u e ( & s _ i d ) ; |
|
|
i f ( ! S U C C E E D E D ( h r e s _ o k ) ) b r e a k ; |
|
|
/ / Ф о р м и р о в а н и е с т р о к и т а б л и ц ы |
|
|
s 1 = V _ B S T R ( & s _ n a m e ) ; |
|
|
s . F o r m a t ( " < T R > < T D > % 1 5 d < A D > < T D > % 2 5 s < A D > < T D > % 1 0 d < A D > " , |
||
V _ l 4 ( & s _ i d ) , s 1 , V _ l 4 ( & s _ y e a r B o r n ) ) ; |
|
|
c o u t « ( L P C T S T R ) s « |
" \ n " ; |
|
/ / П е р е м е щ е н и е у к а з а т е л я т е к у щ е й з а п и с и н а с л е д у ю щ у ю з а п и с ь
642 |
Часть 4. Публикация баз данных в Интернете |
При этом D S N = A u t h o r s , а имя пользователя и пароль задаются пустыми с помощью параметров соединения — UID и PWD. Специальные информационные строки типа BSTR используются методами объектов интерфейса ADO. Для инициализации таких строковых переменных используется функция
A l l o c S y s S t r i n g ( ) , являющаяся членом класса C s t r i n g .
Для установки соединения с источником данных нужно записать строку параметров соединения, хранящуюся в переменной b s F o r C o n n e c t , в объект C o n n e c t i o n .
Для этого используется метод p u t _ C o n n e c t i o n S t r i n g ( ) объекта C o n n e c t i o n : h r e s _ o k = c o n - > p u t _ C o n n e c t i o n S t r i n g ( b s F o r C o n n e c t ) ;
Непосредственно соединение с источником данных осуществляется с помощью метода Ореп():
h r e s _ o k = c o n - > O p e n ( b s E m p t y , b s E m p t y , b s E m p t y , a d C o n n e c t U n s p e c i f i e d ) ;
Здесь переменная b s E m p t y является пустой строкой, так как все параметры соединения заданы в строке b s F o r C o n n e c t , а константа a d C o n n e c t U n s p e c i f i e d определяет синхронный режим открытия соединения с источником данных.
Для выборки данных нужно инициализировать объект Command, связать
его с объектом C o n n e c t i o n методом p u t r e f _ A c t i v e C o n n e c t i o n ( ) , записать текст
команды с помощью метода p u t _ C o m m a n d T e x t ( ) и выполнить метод E x e c u t e Q
объекта Command:
A D O C o m m a n d * c o m m a n d = N U L L ;
C o C r e a t e l n s t a n c e ( C L S I D _ C A D O C o m m a n d , N U L L ,
C L S C T X _ I N P R O C _ S E R V E R , I I D J A D O C o m m a n d , ( L P V O I D * ) & c o m m a n d ) ;
c o m m a n d - > p u t r e f _ A c t i v e C o r i n e c t i o n ( c o n ) ;
c o m m a n d - > p u t _ C o m m a n d T e x t ( b s F o r C o m m a n d ) ;
c o m m a n d - > E x e c u t e ( & v E m p t y , & v E m p t y T o o , a d C m d T e x t , & r e s ) ;
\
Здесь значением переменной b s F o r C o m m a n d является код на Transact-SQL, позволяющий выбирать все поля в таблице A u t h o r s — "select * f r o m A u t h o r s " . Переменные v E m p t y и v E m p t y T o o типа VARIANT имеют следующие значения полей:
v E m p t y . v t = V T E R R O R ;
v E m p t y . s c o d e = D I S P _ E _ P A R A M N O T F O U N D ; v E m p t y T o o . vt = V T _ E R R O R ;
v E m p t y T o o . s c o d e = D I S P _ E _ P A R A M N O T F O U N D ;
Параметр a d C m d T e x t устанавливает, что |
аргумент метода |
p u t _ C o m m a n d T e x t ( ) — переменная b s F o r C o m m a n d |
является строкой на |
языке Transact-SQL. Результирующий набор данных записывается по адресу, заданному переменной res, определенной как
A D O R e c o r d s e t * res = N U L L ;