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

1 ... 94 95 96 [ 97 ] 98 99 100 ... 264


функция mysqlf ield count () возвращает значение, отличное от нуля. Запрос должен возвратить результирующий набор, но произошла ошибка. Это может случиться по самым разным причинам. Например, результирующий набор может быть слишком велик и для его размещения не хватило памяти или во время выборки результатов с сервера произошел какой-то сбой в сети.

Ситуацию немного усложняет тот факт, что функции mysql f ield count () до версии 3.22.24 не существовало. В более ранних версиях вместо нее можно воспользоваться функцией mysql num f ields {). Для того чтобы профамма могла работать с более ранними версиями MySQL, в профаммный код, работающий с mysql f ield count (), включите следующий фрагмент:

#if !defined(MYSQL VERSION ID) MYSQL VERSION ID<32224

#define mysql field count mysql num fields

#endif

Oh позволит при работе с СУБД MySQL версии более ранней, чем 3.22.24, вместо вызова mysql f ield count () делать вызов

mysql num fields() .

Процедура mysql f ield count () возвращает О, это означает, что запрос не возвращает результирующего набора. (Это был запрос INSERT, DELETE или UPDATE).

Процедура mysql store result () выполняется успешно. Запрос возвращает результирующий набор. Обрабатывайте сфоки с помощью процедуры mysqlfetchrow () до тех пор, пока она не возвратит значение NULL .

Ниже при-здена распечатка профаммы, обрабатьшающая любой запрос.

#if !defined(MYSQL VERSION ID) MYSQL VERSION ID<32224

Idefine mysql field count mysql num fields

#endif

void

process query (MYSQL *conn, char *query) {

MYSQL RES *res set; unsigned int field count;

if (mysql query (conn, query) 1= 0) /* сбой запроса */ (

print error (conn, Сбой process query() ); return;

/* запрос завершил работу успешно; определить, вернул он данные или нет */

res set = mysql store result (conn);



if (res set == NULL) /* результирующий набор не возвращен */ {

* означает ли отсутстве результирующего набора, что

* произошла ошибка или не вернулся результирующий набор? */

if (mysql field count (conn) > 0) {

* ожидался результат, но процедура mysql store result()

* ничего не возвратила; произошла ошибка */

print error (conn, Невозможно обработать результирующий набор );

else {

* результирующий набор не возвращен; запрос не вернул данных

* (это не был запрос SELECT, SHOW, DESCRIBE или EXPLAIN),

* просто верните количество строк, обработанных запросом

printf ( обработано %1и строкХп ,

(unsigned long) mysql affected rows (conn));

else /* возвращен результирующий набор */ {

/* обработать строки и очистить результирующий набор */ process result set (conn, res set); mysql free result (res set);

Альтернативные методы обработки запросов

Эта версия процедуры process query () имеет три особенности.

С помошью mysql query () она вызывает запрос.

Для выборки результируюшего набора используется процедура

mysql store query().

Если результирующий набор не получен, вызывается процедура mysql f ield count (). Она должна распознать ситуацию, была ли это ошибка или результируюшего набора вообще быть не должно.

Для всех этих аспектов обработки запроса можно предложить альтернативные варианты.

Вместо запроса, использующего ограниченные символом NULL строки и функции mysql query О, воспользоваться строкой со счетчиком и функцией mysql real query ().



Для получения результирующего набора необходимо заменить функцию mysql store result () функцией inysql use result ().

В процессе определения, произощла ли ошибка или просто этот запрос ничего не должен возвращать, отказаться от использования функции mysql f ield count () В пользу функции mysql error ().

Любой из этих вариантов или сразу все можно использовать в процедуре process query (). Вот процедура process real query (), которая аналогична процедуре process query (), но в ней использовано сразу три варианта:

void

process real query (MYSQL *conn, char *query, unsigned int len) (

MYSQL RES *res set; unsigned int field cot!nt,-

if (mysql real query (conn, query, len) != 0) /* сбой запроса

print error (conn, сбой process real query() ); return;

/* запрос завершил работу успешно; определить, вернул он данные или нет */

res set = mysql use result(conn) ;

if (res set == NOLL) /* результирующий набор не возвращен */ (

* означает ли отсутствие результирующего набора, что

* произошла ошибка или не вернулся результирующий набор?

♦/

if (mysql errno(conn) != 0) /* произошла ошибка */

print error(conn, Невозможно обработать результирующий набор );

else {

* результирующий набор не возвращен; запрос

не вернул данных

* (это не был запрос SELECT, SHOW, DESCRIBE или EXPLAIN),

* просто верните количество строк, обработанных запросом */

*/ printf( обработано %1и строкХп ,

(unsigned long) mysql affected rows(conn)); else /* возвращен результирующий набор */ {

/* обработать строки и очистить результирующий набор */ process result set(conn, res set); mysql free result(res set);



1 ... 94 95 96 [ 97 ] 98 99 100 ... 264

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