Теория и практика построения баз данных (1088289), страница 126
Текст из файла (страница 126)
Если вы хотите, чтобы ваше приложение выглядело и вело себя лучше, вы должны быть способны соответствующим образом модифицировать этн примеры. Сейчас вам следует просто научитъся использовать АЕ)О. Все эти примеры работают с базой данных У!етч К!т!яе. В некоторых из них мы соединяемся с источником данных Ч!еьчй)бйе55 — базой данных 5ьаь 5егчег, в других мы используем Ч)ечтй1бйеОгас!е — базу данных Огас!е.
В последнем примере требуется изменить всего один оператор, чтобы переключиться с 50Е Бегчег на Огас1е! Это удивительно, и это как раз то, на что надеялись разработчики спецификации ОВВС. Как вы знаете из предыдущей главы, протокол НТТР не имеет состояния. АБР-процессор, тем не менее, будет поддерживать состояние транзакции. Для каждой транзакции он хранит набор сеансовых переменных. В этих примерах мы будем использовать сеансовые переменные для сохранения соединений. Оператор создает сеансовую переменную с именем «або» и присваивает ей строковое значение «ЧЧотчзегв».
Более осмысленные примеры последуют далее. Чтобы запустить любую из этих АЗР-страниц, откройте браузер и введите Истр:г?1оса1ловтгЧ)енй1бреЕхаюр1е1Хиня файла,авр Здесь имя файла — это имя АЗР-страницы. Если вы запускаете АБР-страницу не с того компьютера, где работает П5, а с какого-то другого, вместо «!оса!Ьовв» следует ввести адрес вашего сервера. Пример 1 — чтение таблицы В листинге 15.1 показана А5р-страница, которая отображает содержимое табли- цы АВТ15Т. Листинг 15.1. Аг1)з1.азр <НТМЕ> <НЕАО> <МЕТЯ НТТР-ЕОО)Ч="Сопгепт-Туре" СОИТЕИТ="!ехьХЬгю1;сбагвеб=н1пбонв-1252"> <Т1ТЕЕ>Ягю в 1<! Т1ТЕЕ> <гНЕАО> <1--№1пс1обе чтггиа1-"Ч1енй1ООеЕхаюр1е1габочбз.)лс"-- <ВООУ> <в 01ю оЬОСопп, оЬ)йесогб5ет, чаг5о1 11 1зОЬОест(5евв1оп1" сопл")) ТЬеп 'если соединение уже установлено.
' используеи его 5ег оЬ)Сопл = 5евз)оп(" сопл") Е1ве 5ет оЬОСопп - 5егчег,СгеатеОЬОесССАОООВ.соппесгтоп") ' устанавливаем соединение оЬОСопп.преп "Ч)енйтбйе55", "ва" ' открываеи файл ООВС 5ОЕ 5егчег ' как пользователь ва, без пароля оЬОСопп. 1во1ат)опЕече! = аОХассйеаОСопвпггеб ' избегаен «грязного» ' чтения 5ес 5езвтоп!" сопл") = оЬОСопп Епб 11 5ес оббйесогб5е1=5егчег.СгеатеОЬ)ест!"АОООВ.йесогбзеС') 'создаеи объект ' гесоговес чаг5р1 = "5ЕЕЕСТ Аг11втнаюе. Иаг1опа11ьу ЕЙОН АНП5Т" 'настраиваен ' 5ОЕ-коканду оьдйесого5ет.брел чаг5о1, оьбсопп, аобреп51ас1с, аоеосиеаобп1у 'курсор статический. обновление не требуется <ТАВЕЕ ВОВОЕй= 1 ВОСОЕОВ=№ТТТГТТ СЕЕЕ5РЯС1И6=5 РОИТ РАСЕ="Аг!а1" СОЕОР=№000000><САРТ!ОИ><В>АНТ15Т<!В><гСАРТ1ОИ><гЕОИТ> <ТНЕАО> <Тй> Примеры использования А00 883 Листинг 15.1 (продолжение) </тй> 5ЕЕЕСТАгтгэгйапи.
Иатгопа)ггу ГЙОМАЙТ!5Т 882 Глава 15. 00ВС, ОЬЕ 0В, А00 и АЯР <ТН ВЯСОЬОЙ-ФсСсСсС ВОЙОЕЙСОЬОЙ=)1000000><ГОНТ 5!7Е=2 ЕЯСЕ-"Агта)" СОЕОЙ=0000000>йав(е</ГОНТ /ТН> <ТН ВВСОЬОЙ=УсСсСсС ВОЙОЕЙСОЕОЙ=(/000000 ><ГОНТ 5!7Е=2 ГАСЕ="Аг1а)" СОЬОЙ=(гй00000>йа(1опа)~гу</ГОНТ></ТН> </ТЙ> </ТНЕАО> <ТВООУ> <з Оп Еггог Йеэиве йехг оЬОЙесог05ет.МочеГтгвт оо нш )е йот оЬ)йесог05е!.ест 2> <Тй УАЕ1ОИ=ТОР> <тО ВОЙОейсОСОЙ-(ГсСсссс еОит 517е=2 ГАсе="Аг)а)" СОСОЙ-ФСССССС><1=5егчег.НТМЕЕпсог)е(оЬ)йесог05ет("Агы э(йавге"))Ж><ВЙ></ГОНТ></ТО> <ТО ВОЙОЕЙСОСОЙ=(гсСсСсС> ЕОИТ 517Е-2 ГАСЕ="Аг1а)" СОЬОЙ=ФСССССС><$=5егчег.НТМСЕпсоее(ЬЬ)йесогг)5ег("Иаг)опа)1гу"))1> Вй /ЕОйт></ТО) <1 Епг) !т йехгФ> <Тй> <х оЬОЙесог05еЬ,МочейехЬ )оор1> </ТВООУ> <ТГООТ></ТЕООТ> </ТАВЬЕ> </ВООУ> </НТМЬ> Начинается страница со стандартного НТМЬ.
Первый раздел серверного кода создает объект Соппесбоп, а затем объект йесогг(5еЬ содержащий результаты выполнения следующего ЯЯЬ-оператора: Поскольку соединения используют большое количество ресурсов, как в смысле времени, требуемого на их создание, так и в смысле количества потребляемой ими памяти, объект Соппесйоп в этом примере сохраняется в сеансовой переменной сопл.
В первый раз, когда пользователь вызовет АВР-страницу, соедине- ние еше не будет существовать. В этом случае результатом вызова функции 1вОЬ)ест!" сопл") будет значение Га(ве, так как переменная сопл еще не указывает ни на какой объект, Код, следующий за оператором Е(ве, создает объект Соппесйоп. Далее создается объект йесогб5ет для оператора 5ЕЕЕСТ в переменной чаг5()!.
Следующий раздел АВР-страницы содержит НТМЬ-код, предназначенный для браузера. За ним следует несколько фрагментов серверного сценарного кода, перемешанного с НТМЬ. Оператор Оп Епог йеввюе йех1 отменяет обработку ошибок сценарным ядром АВР, предписывая продолжать выполнение сценария. Хорошая АКР-страница в этом случае обеспечила бы обработку ошибок. Последняя часть страницы просто создает НТМЬ-код и вставляет в него полученные значения. Пикл оЬ)йесогг)5еЬ.МочеГ!гт(...Мочейех( представляет стандартную логику последовательной обработки файла. Результат выполнения этой АВР-страницы показан на рис.
15ТЕ В этой странице и в породившем ее АВР-файле нет ничего впечатляющего, за исключением следующего обстоятельства: если бы эта страница находилась в Интернете, ее могли бы видеть более 250 миллионов человек во всем мире! При этом им не понадобилось бы никакого программного обеспечения, кроме того, что уже установлено на их компьютерах.
Рис. 16.9. Результат выполнения АЯР-страницы АП)в1.авр 584 Глава 15. ОВВС, ОСЕ ОВ, АРО и АЯР Примеры использования АОО 585 Пример 2 — чтение таблицы обобщенным способом В первом примере объекты, составляющие объектную модель АРО, использовались по минимуму. Мы можем расширить этот пример за счет использования коллекции Г(е!Вв Предположим, мы хотим задавать имя таблицы в качестве параметра, а на выходе получать содержимое всех столбцов этой таблицы, за исключением суррогатного ключа.
А5р-страница, показанная в листинге 15.2, выполнит эту задачу, с той оговоркой, что имя таблицы будет задаваться в переменной чагтаЫейаве. В следующем примере будет показано, как организовать ввод имени таблицы с использованием средств обработки форм НТМЕ. Листинг 15.2. СыатогпегОгас)е.аар «НТМС> <НЕАО> МЕтд НТТР-ЕО01У="Сап!ел!-туре" СОНТЕйт=тбехт/Ьтв);сЬ вес. )пасы -1252- <Т!ТСЕ>таЫ е Отвр1ау Раде</Т!ТЕЕ> </НЕАО> <ВООУ> <1-Ф пс1ыае чтгтыа1="У(енй(одеЕхавр1е((абочЬв.(пс"--> <Ж Отв оЬ~Сапп.
оЬ1йесог05ет, оЬОГ)е10 Отв чагйывСо1в, чан, чаг5о1 0)в чагТаЫейаве. чагКеуйаве чагТаЫепаве = "С05ТОМЕй" чагКеуйаве = "С05ТОМЕЙ!О" !Г 1зОЬОесС(5еявтоп(" сопл")) Тйеп ' если соединение уие установлено, ' используеи его 5е! оЬ)Сопл = 5евзтоп(" сопл") Е1зе 5ет оЬОСопп = 5егчег СгеатеОЬ1ест("АОООВ.соппест1оп") ' устанавливаеи ' соединение 'аткрываеи ООВС-файл Огас1е из-лод учетной записи вувтев с паролеи вапайег оЬ)Сопл.орел "Ч1енйтайеОгас1е", "вувсев", "вапацег" оЬ)Сопл.!зо1а((апСече1 = ааХасьйеааСоввтттеб ' избегаеи «грязного» чтения 5ет 5еввтоп(" сопл") = оЬОСопп Епб 1Г 5ес аЬ)йесог05ес = 5егчег.СгеатеОЬ)ест("АОООВ.йесоговеС") чаг500 = "5ЕЕЕСТ * ГЙОМ " а чагТаЫейаве оЬ)йесога5еС.Орел чаг5О1.
оЬОСопп ' тип курсора и тил блокировки ' не поддерживаются драйверои Огас1е Ж> <ТАВСЕ ВОЙОЕЙ=! ВИСОСОЙ=((тттттт СЕГС5РАС!КО=5><ГОНТ ГАСЕ="Аг(а1" СОЕОЙ = т)000000> САРТ10й><В <ЖчагТаЫ ейавеЖ> (1и Огас1е батаЬаве) </В /САРТ10Н (ГОНТ> <ТНЕАО> <Тй> <Ж чагйывСо1з - оЬОйесаг05ес. Гте1()в. Соапс Гог чаг1 = 0 'ьа чагйывСо1я - 1 5ет оЬ)Гте10 - оЬ)йесог05еС.Г(е10в(чаг!) !т оь1Г(е)о.йаве чагкеуйаве тьеп ' опускаея суррогатный ключ ж > <ТН ВЯСОЕСЙ=Фсбсбс0 ВОЙОЕЙСОСОЙ=Ф000000 ><ГОНТ 512Е-2 ГАСЕ="Агта1" СОЕОЙ=Ф00030 Ж=оЬОГ)е10. йаве Ж></ГОНТ></ТН> <Ж Епа !У йехтЖ> </Тй> </ТНЕАО> <ТВООУ> <Ж Оп Еггог йеяыве йех1 оЬОйесога5ет.МочеГ)гвС Оо нЫ )е йот оЬОйесог05ет,еот Ж> <Тй НАС!ОН=ТОР> <Ж чагйавСо1в - аЬОйесога5ет. Г(е1ав.
Соыпс Гог чаг) " 0 то чагйигпСо1в - ! 5ес оЬОГ)е10 = оЬ)йесог05еь.Гте1ав(чаг1) 1/ оЬ1Гте1().йаве чагКеуйаве Тнеп ' опускаеи суррогатный ключ Ж> <ТО ВОЙОЕСОЕОЙ=((сОсОсО > ГОНТ 5!ЕЕ - 2 ГАСЕ="Агта1" СОЕОЙ-()000000><Ж-5егчег НТМСЕпсобе (оЬОГте10,ча1ие тЖ><ВЙ>«/ГОНТ></ТО> <Ж Епо 1Г йехтЖ> </Тй> <Ж оЬОйесога5ет.