Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009

.pdf
Скачиваний:
4969
Добавлен:
14.05.2016
Размер:
14.64 Mб
Скачать

16. Интерфейсы программирования 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

Описание:

 

 

Отмена

- База данных

 

 

 

 

 

База данных:

c:Y. ASDK\ASP\DATABASE\Authors.mdb

Справка

Выбрать...

|

Создать... j Восстановить... j

Рцать... j

 

 

 

Дополнительно...

Системная база данных

Нет

С База данных:

Ьистемная Оаза данных.

Параметры>>

Рис. 16.3. Окно настройки пользовательского DSN администратора ODBC

При необходимости можно создать собственную БД MS Access или другого типа, установив связь с БД с именем DSN описанным выше способом. При этом для соответствия с логикой работы данной программы в БД должно быть не менее трех колонок с такими же именами.

Для получения результата достаточно загрузить приведенный выше HTML-документ в обозреватель и выбрать в нем единственную ссылку. Результат работы модуля "od.exe" приведен на рис. 16.4.

S Q L F r e e H a n d l e ( ) .

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 ;

16. Интерфейсы программирования Web-приложения

639

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 . v t = 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 O A D O C o n n e c t i o n * c o n = N U L L ;

A D O R e c o r d s e t * r e s = N U L L ;

A D O C o m m a n d * c o m m a n d = N U L L ;

/ / И н и ц и а л и з а ц и я и н ф о р м а ц и о н н о г о о б ъ е к т а H R E S U L T h r e s _ o k = S _ O K ;

/ / С о з д а н и е о б ъ е к т а C o n n e c t i o n

h r e s _ o k = 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 n n e c t i o n , 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 _ I A D O C o n n e c t i o n , ( L P V O I D * ) & c o n ) ; / / З а п и с ь с т р о к и п а р а м е т р о в с о е д и н е н и я в b s F o r C o n n e c t

i f ( S U C C E E D E D ( h r e s _ o k ) )

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 ) ; / / У с т а н о в к а с о е д и н е н и я с и с т о ч н и к о м д а н н ы х

i f ( S U C C E E D E D ( h r e s _ o k ) )

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 ) ;

/ / С о з д а н и е о б ъ е к т а C o m m a n d i f ( S U C C E E D E D ( h r e s _ o k ) )

h r e s _ o k = 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 , CLSCTX _ INPROC _ SERVER, 11 D_lA 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 с о б ъ е к т о м C o n n e c t i o n i f ( S U C C E E D E D ( h r e s _ o k ) )

h r e s _ o k = c o m m a n d - > p u t r e f _ A c t i v e C o n n e c t i o n ( c o n ) ; / / З а п и с ь т е к с т а к о м а н д ы в о б ъ е к т C o m m a n d

i f ( S U C C E E D E D ( h r e s _ o k ) )

h r e s _ o k = 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 ) ; / / В ы п о л н е н и е к о м а н д ы з а п и с и д а н н ы х

/ / в п е р е м е н н у ю r e s ( э к з е м п л я р о б ъ е к т а R e c o r d S e t ) i f ( S U C C E E D E D ( h r e s _ o k ) )

hres _ ok = 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 , &res); / / О п р е д е л е н и е п е р е м е н н ы х д л я х р а н е н и я д а н н ы х

C O I e V a r i a n t s _ i d ;

C O I e V a r i a n t s _ n a m e ;

C O I e V a r i a n t s _ y e a r B o r n ;

/ / И н и ц и а л и з а ц и я в р е м е н н ы х с т р о к о в ы х п е р е м е н н ы х C S t r i n g s = "";

C S t r i n g s 1 = " " ;

/ / И н и ц и а л и з а ц и я с п е ц и а л ь н о й л о г и ч е с к о й п е р е м е н н о й V A R I A N T B O O L a d o _ E O F = V A R I A N T _ F A L S E ;

/ / О п р е д е л е н и е к о н ц а н а б о р а д а н н ы х

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 " ;

 

/ / П е р е м е щ е н и е у к а з а т е л я т е к у щ е й з а п и с и н а с л е д у ю щ у ю з а п и с ь

16. Интерфейсы программирования Web-приложения

641

h r e s _ o k = r e s - > M o v e N e x t ( ) ; 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 = r e s - > g e t _ E O F( & a d o _ E O F);

}

/ / Г е н е р а ц и я о к о н ч а н и я H T M L - д о к у м е н т а c o u t « " < Д а Ы е > " ;

c o u t « " < / B O D Y X / H T M L > " ; / / О с в о б о ж д е н и е р е с у р с о в

r e s - > C l o s e ( ) ; c o n - > C l o s e ( ) ;

C o U n i n i t i a l i z e ( ) ;

S y s F r e e S t r i n g ( b s F o r C o n n e c t ) ; S y s F r e e S t r i n g ( b s E m p t y ) ;

S y s F r e e S t r i n g ( b s F o r C o m m a n d ) ;

r e t u r n ;

}

Этот модуль посылает в стандартный поток вывода НТМ L-документ, аналогичный документу, генерируемому модулем, использующим интерфейс ODBC (см. раздел 16.1.4).

Для запуска CGI-модуля, использующего интерфейс ADO, нужно выполнить такую же последовательность действий, как и указанную в разделе 16.1.4.

Поясним операции, выполняемые приведенным модулем. В начале модуля подключаются заголовочные файлы. Файл "stdafx.h" генерируется средой Visual С++ и содержит подключение группы заголовочных файлов, входящих в состав стандартных библиотек, которые определяют тип проекта.

В первых строках функции m a i n ( ) производится инициализация служебных переменных. Для инициализации системы СОМобъектов используется

функция Colnitialize(NULL).

Затем производится инициализация служебных переменных и создание

объекта Connection:

A D O C o n n e c t i o n * c o n = N U L L ; H R E S U L T h r e s _ o k = S _ O K ;

h r e s _ o k = 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 n n e c t i o n , 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 n n e c t i o n , ( L P V O I D * ) & c o n ) ;

Так как устанавливается соединение с ODBC-источником данных, то необходимо задать параметры DSN-соединения. Для этого используется строковая переменная csForConnect:

C S t r i n g c s F o r C o n n e c t B S T R b 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 F o r C o n n e c t . A l l o c S y s S t r i n g ( ) ;

21 Зак. 541

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 ;