Программирование >>  Программный интерфейс приложений 

1 ... 103 104 105 [ 106 ] 107 108 109 ... 264


(Вот почему полностью отсутствует программный код проверок на ошибки в сценарии dumpmembers; интерфейс DBI берет все это на себя.) В разделе Обработка ошибок изложены и другие способы реакции на ошибки.

В случае успешного завершения работы метода connect () переменной $dbh возврашается дескриптор базы данных. (Если работа метода connect () завершается ошибкой, он возврашает undef. Однако с атрибутом RaiseError в сценарии метод connect О не возвращает управление, а интерфейс DBI выдаст сообщение об ошибке и завершает свое выполнение в случае ошибки.)

После подключения к базе данных сценарий dump members генерирует запрос SELECT для выборки списка членов, а затем выполняет цикл по обработке возвращаемых запросом строк. Эти строки и составляют результирующий набор.

Для выполнения запроса сначала его нужно создать, а затем выполнить:

# создать запрос

$sth = $dbh->prepare ( SELECT last name, first name,

suffix, email, . street, city, state, zip, phone FROM member ORDER BY last name );

Ssth->execute();

Метод prepare () вызывается с использованием дескриптора базы данных. Он передает оператор SQL драйверу для предварительной обработки перед выполнением. Одни драйверы действительно производят какие-то операции на этой фазе. Другие просто запоминают эту информацию до момента вызова метода execute () для выполнения оператора. Значение, возвращаемое методом ргерагеО, является дескриптором оператора $sth в случае успешного завершения или undef в случае ошибочного. Дескриптор оператора используется для дальнейшей обработки, имеющей отношение к данному оператору.

Прошу обратить внимание, что запрос не завершается символом точка с запятой . В процессе длительного использования программы mysql у вас, без сомнения, выработалась привычка завершать операторы языка SQL символом ; . Однако эту привычку надо забыть, так как интерфейс DBI расценивает такой синтаксис как ошибочный. Это справедливо и при добавлении к запросам последовательности \д .

При запуске метода без передачи ему каких-либо параметров можно опустить скобки. Вот два абсолютно аналогичных вызова:

Ssth->execute(); Ssth->execute;

Я предпочитаю указывать скобки потому, что это позволяет отличать метод от переменной. Вы можете иметь другие предпочтения.

После вызова execute () обработаем полученный список. В сценарии dump members цикл выборки строк просто распечатывает содержимое каждой строки:



# прочесть результаты, возвращаемые запросами, и очистить память

while (dary = $sth->fetchrow array())

print join { \t , @ary), \n ;

$sth->finish();

Метод fetchrowarray () возвращает массив, содержащий значения столбцов текущей строки и пустую строку, когда таких строк нет. Таким образом, цикл последовательно выбирает строки, возвращаемые оператором select, и распечатывает каждый, разделяя значения столбцов символами табуляции. Пустые значения в базе данных возвращаются в сценарий Perl как значения undef, а не слово null .

Обратите внимание, что символы перевода на новую строку ( \t и \п ) заключены в двойные кавычки. Управляющие последовательности в Perl интерпретируются только тогда, когда они заключены в двойные кавьгаки. При наличии одинарных кавычек выводимые строки будут заполнены литеральными образцами строк \t и \п .

После заверщения цикла выборки вызов метода finish () дает знать интерфейсу DBI, что дескриптор оператора больще не нужен, и все временные ресурсы, отданные под него, могут быть освобождены. Не обязательно вызывать метод finish(), если выбрана только часть результирующего набора (неважно - намеренно или по причине сбоя). Однако указание метода finish О безопасно после цикла fetch и я нахожу, что значительно проще его вызвать и завершить операцию, чем специально писать программу, необходимую для анализа ситуации, когда вызов метода finish () необходим и когда он не нужен.

После того как список членов будет распечатан, можно отключиться от сервера и завершить работу сценария:

Sdbh->disconnect(); exit(O) ;

Сценарий dump members иллюстрирует несколько самых характерных для большинства программ, работающих с интерфейсом DBI, концепций. Этого вполне достаточно для того, чтобы начать писать свои программы, работающие с интерфейсом DBI. Например, чтобы распечатать содержимое другой таблицы, все, что необходимо сделать, это изменить текст оператора select, который будет передан методу prepare (). Конечно, если есть насущная необходимость посмотреть, каким образом работает этот метод, можно прямо перейти к изучению раздела Подготовка интерфейса к работе . В нем проиллюстрировано создание списка членов для программы ежегодного банкета Исторической Лиги и списка членов лиги. Однако интерфейс DBI обладает и многими другими полезными возможностями. Их детальное изложение можно найти в последующих разделах. Там и можно посмотреть, каким образом в Perl можно выполнять более сложные операции, чем простой оператор select.



Обработка ошибок

Сценарий dump members включает атрибут обработки ошибок RaiseError при инициализации метода connect О. Таким образом, возникновение ошибки автоматически прервет выполнение сценария и выдаст диагностическое сообшение. Ошибки можно обрабатывать и другим способом. Например, обработку ошибочных ситуаций можно запрограммировать, не полагаясь на возможности интерфейса DBI.

Для того чтобы подробнее ознакомиться с поведением интерфейса DBI при обработке ошибочных ситуаций, обратим внимание на последний аргумент метода connect О. Этими двумя атрибутами будут RaiseError и PrintError.

Атрибут RaiseError активизирован (установлено ненулевое значение). В случае возникновения ошибки интерфейс DBI для вывода сообщения и заверщения вьшолнения сценария вызывает метод die ().

Атрибут PrintError активизирован. В случае возникновения ошибки интерфейс DBI вызывает метод warn (), но сценарий продолжает выполнение.

По умолчанию параметр RaiseError заблокирован, а параметр PrintError активизирован. В этом случае, если при выполнении метода connect О возникает ошибка, интерфейс DBI вьщает сообщение, но выполнение сценария не прерывается. Таким образом, при обработке ошибок по умолчанию, которой можно добиться, не передавая методу аргументов, ошибки можно обрабатывать следующим образом:

$clbh = DBI->connect ($clsn, $user name, $passworcl) or exit (1);

При возникновении ошибки метод connect () возвращает значение undef и инициирует вызов метода exit О . В этом случае не нужно печатать сообщение об ошибке потому, что интерфейс DBI уже вьщал такое сообщение.

При явном определении атрибутов проверки ошибок вызов метода connect () выглядит следующим образом:

$dbh = DBI->connect ($dsn, $user name, $password, { RaiseEiror => 0, PrintError => 1)) or exit (1);

Это потребует больших затрат времени, но даст больше информации о поведении программного кода случайному пользователю.

Если есть намерение писать собственноручно программный код, обрабатывающий ошибочные ситуации, необходимо заблокировать параметры RaiseError И PrintError:

$dbh = DBI->connect ($dsn, $user name, $password, { RaiseError => 0, PrintError => 0))

or die Невозможно подключиться к серверу: $DBI::err ($DBI: : eг гs t г ) \n ;



1 ... 103 104 105 [ 106 ] 107 108 109 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика