|
Программирование >> Программный интерфейс приложений
Как функция mysql query(), так и функция mysql real queryо возвращают О в случае успешного завершения запроса и ненулевое значение в случае ошибки. Успешное завершение запроса означает, что сервер не определил в нем ошибки и мог его выполнить. Это никак не свидетельствует о результате выполнения запроса. Например, это не значит, что запрос select выбрал хоть одну строку или что оператор delete удалил хотя бы одну строку. Проверка результата, полученного ог выполнения запроса, требует дополнительной обработки. Запрос может дать ошибку по совершенно различным причинам. Вот самые вероятные из них. ш Он содержит синтаксическую ошибку. ш Он содержит семантическую ошибку, например, в запросе делается обращение к столбцу, не существующему в таблице. ш У вас нет прав для осуществления доступа к данным, указанным в запросе. Запросы можно сфуппировать в две общие категории: запросы, возвращающие результаты, и запросы, не возвращающие результаты. Такие запросы как insert, delete И update попадают в категорию запросов, не возвращающих результата . Они ничего не возвращают даже для запросов, которые модифицируют базу данных. Единствениой информацией, которую можно от них получить, является количество обработанных строк. Такие запросы, как select и show попадают в категорию запросов, возвращающих результат , все-таки как никак их предназначением является возвращение какого-то результата. Набор строк, возвращаемый таким запросом, назьтается результирующим набором . В СУБД MySQL это тип данных mysqlres, представляющий собой сфукгуру, содержащую значения данных в строках и метаданные о значениях (такие как названия столбцов и длины значений данных). Пустой результирующий набор (т.е. такой, который содержит ноль строк) нельзя идентифицировать как нет результата . Обработка запросов, не возвращающих результатов Для обработки запросов, не возвращающих результирующих наборов, запрос генерируется с помощью функции mysql query () или mysql real query (). При успешном завершении запроса можно будет узнать, сколько запросов было вставлено, удалено или модифицировано. Для этого нужно вызвать функцию mysql af f ected rows (). Это делается так: xf (mysql query (conn, INSERT INTO my tbl SET name = My Name ) != 0) print error ( Сбой оператора INSERT ); else printf ( Оператор INSERT успешно завершен, обработано: %lu строкХп , (unsigned long) mysql affected rows (conn)); Обратите внимание, каким образом результат mysql af f ected rows О преобразуется в переменную типа unsigned long для вывода на печать. Эта функция возвращает значение типа my ulonglong. Так сделано потому, что печатать значение этого типа напрямую в некоторых системах нельзя. (Например, я убедился, что она работает под UNIX FreeBSD, но дает сбой при работе в Solaris.) Преобразование типа значения в тип unsigned long и указание типа формата %1и решает эту проблему. Подобное рассуждение применимо к любым функциям, возвращающим значения типа my ulonglong, таким как mysql num rows О и mysql insert id {). Помните это, если хотите, чтобы ваши клиентские программы были переносимы. Функция mysql rows af fected О возвращает количество строк, обработанных запросом, но значение самого термина обработано строк зависит от типа запроса. Для запросов insert, replace или delete это количество добавленных, замещенных или удаленных строк соответственно. Для запроса update это означает количество реально модифицированных строк. СУБД MySQL не модифицирует строку, которая содержит те же данные, что и новые. Это значит, что хотя строка и может быть выбрана для модификации (с помощью предложения where оператора update) она не будет реально изменена. Вообще, для оператора update термин обработано строк является неоднозначным. Это может означать совпадающих строк , т.е. количество строк, выбранных для модификации, даже если операция модификации реально не изменит их значений. Существует возможность настроить систему таким образом. Для этого во время подключения к серверу нужно процедуре mysql real connect () передать значение флага client found ROWS. Значение client FOUND ROWS также можно передать как аргумент и процедуре do connect (), она передаст это значение процедуре mysql real connect (). Обработка запросов, возвращающих результаты Запросы, возвращающие данные, делают это в виде результирующего набора. Они могут быть получены после передачи запроса на сервер с помощью функций mysql query о или mysql real query (). Нужно помнить, что запрос select в СУБД MySQL не является единственным запросом, возвращающим строки. К запросам такого рода можно отнести запросы show, describe и explain. Для Всех этих запросов необходимо произвести обработку полученных после запроса строк. Обработка результирующего набора предполагает следующие щаги. С помощью mysql store resuIt() или mysql use result() получить результирующий набор. Эти функции возвращают указатель на mysql res в случае успешного завершения или значение null в случае ошибки. Позже мы остановимся на различиях между mysqlstoreresult () и mysql use result О и условиях, при которых можно будет одну функцию предпочесть другой. Здесь в примерах мы будем использовать функцию mysql store result (), немедленно возвращающую полученные строки с сервера и сохрашпощую их в областях данных клиента. Для каждой строки результирующего набора вызовем mysql fetch row(). Эта функция возвращает значение mysql row, которое представляет собой указатель на массив строк, представл5ПОЩих значения каждого столбца строки. Что вы будете делать со строкой, зависит от задач приложения. Можно просто распечатать значения в столбцах, на их основе произвести какие-то статистические вычисления, или произвести какие-то другие действия. Функция mysql fetch row () возвратит значение null , когда в результирующем наборе строк больше не осталось. После завершения всех операций с результирующим набором для очистки памяти, которую он использует, необходимо вызвать mysql free result(). Если этого не сделать, ваше приложение может вызвать переполнение оперативной памяти. (Очень важно не забывать это делать для приложений, работающих длительное время; в противном случае скоро станет заметно, что система медленно, но верно все чаще будет занята процессами, которые будут поглощать все больше ресурсов системы.) В следующем примере рассмотрим обработку результирующего набора, полученного после выполнения запроса; MYSQL RES ♦res set; af (mysql query (conn, SHOW TABLES FROM mysql ) i= 0> print error (conn, сбой mysql query() ); else ( res set = mysql store result (conn); /* генерировать результирующий набор */ if (res set == NULL) print error (conn, Сбой mysql store result!) ); else { /* обработать результирующий набор, a затем удалить его */ process result set (conn, res set); mysql free result (res set);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |