|
Программирование >> Программный интерфейс приложений
Здесь мы совсем обошли вниманием вызов функции procGss rGsult sGt (), ПОМОШЬЮ которой обрабатывается каждая строка из результирующего набора. Сделаем это. В обшем случае функции обработки результирующего набора основаны на цикле, имеющем следующий вид: MYSQL ROW row; while ((row = mysql fetch row (res set)) != NULL) { /* произвести определенные операции над содержимым строки */ Функция mysql fGtch row() возвращает в mysql row значение, которое является указателем на массив значений. Таким образом доступ к каждому значению можно осуществить с помощью выражения row [ i ], где 1 лежит в диапазоне от О до количества столбцов в строке минус один. Вот несколько особенностей типа данных mysql row, которые необходимо иметь в виду при работе с ним. Тип mysqlrow является указательным типом. Таким образом переменные этого типа необходимо объявлять как mysqlrow row, а не как mysql row *row. Строки массива mysql row завершаются пустым значением. Однако если столбец содержит двоичные данные, он может содержать и пустые байты. Такую строку нельзя рассматривать как строку, ограниченную пустым значением. Получите длину столбца, чтобы определить, какую длину может иметь значение столбца. Значения данных всех типов возвращаются как строки. Для обработки числовых значений как чисел их необходимо преобразовать из строкового формата в числовой самостоятельно. Значения null в массиве mysql row представляются указателями null . За исключением случая, когда столбец объявлен как not null , всегда необходимо проверять, являются или не являются значения в столбцах указателями со значением null . Приложения, создаваемые вами, могут делать все что угодно с данными в каждой строке. Д.ля иллюстрации просто распечатаем строки с табуляциями между столбцами в качестве разделителей. Для этого нам потребуется дополнительная функция из клиентской библиотеки mysql mitn f ields О. Эта функция возвращает количество столбцов в строке. Вот программный код для process rGsult sGt (): void process result set (MYSQL *conn, MYSQL RES *res set) { MYSQL ROW row; unsigned mt i; while ((row = mysql fetch row (res set)) != NULL) { for (i = 0; 1 < mysql num fields (res set); i++) { if (i > 0) fputc CU, stdout) ; printf ( %s , row[i] != NULL ? row[i] : NULL ); } fputc (\n, stdout); if (mysql errno (conn) != 0) print error (conn, mysql fetch row() failed ); else printf ( возвращено рядов %lu \n , (unsigned long) mysql num rows (res set)); Профамма process result set () распечатывает каждую сфоку в формате разделения столбцов табуляцией (отображая значения NULL словом NULL) с последующим количеством выбранных строк. Это количество получено с помощью функции mysql num rows (). Как функции mysql affected rows () и mysql num rows (), эта функция возвращает значение типа my ulonglong. Таким образом преобразуем в тип unsigned long и с помощью формата %1и распечатаем его. За циклом выборки сфок следует тестирование на ошибки. При создании результирующего набора с помошью mysql store result {) значение NULL , возвращаемое из mysql fetch row (), будет означать больше сфок нет . Однако при создании результирующего набора с помощью mysql use result О значение NULL , возвращаемое из mysql fetch row о, будет означать как больше строк нет , так и то, что произошла ошибка. Это тестирование просто дает возможность про-фамме process result set () определить, произошла или нет ошибка, независимо от метода создания результирующего набора. Эта версия process result set () взяла на вооружение минимали-стический подход к выводу значений столбцов, который имеет определенные недостатки. Например, предположим, что выполняется следующий запрос: SELECT last name, first name, city, state FROM president Oh даст следующий результат:
Этот вывод можно улучшить, добавив наименования столбцов и выровняв столбцы по вертикали. Для этого необходимо узнать имена столбцов и самое длинное значение в каждом столбце. Эта информация имеется в наличии, но не как часть данных, а как часть метаданных результирующего набора (данные о данных). После небольшого усоверщен-ствования кода обработки запроса, в разделе Метаданные результирующего запроса мы сможем усоверщенствовать формат вывода данных. Печать двоичных данных Значения столбцов, содержащих пустые данные, могут не сработать правильно с помощью спецификации формата %s оператора printf (). Оператор printf {) ожидает строку, завершающуюся пустым значением, и распечатывает строку только до пустого значения. Для двоичных данных лучше всего воспользоваться длиной столбца. Таким образом можно будет распечатать все значение. Для этого можно воспользоваться операторами fwrite () или putc () . Обработка общих запросов Все предьщущие примеры обработки запросов были написаны исходя из того, возвращает или не возвращает оператор данные. Это было возможно благодаря тому, что текст самого запроса был включен в код. Мы использовали оператор INSERT, который не возвращал результирующий набор, и оператор SHOW TABLES, который возвращал. Однако зачастую нельзя заранее знать, какой тип оператора имеет запрос. Например, при выполнении запроса, который вводится с клавиатуры или из файла, это может быть произвольный оператор, т.е. заранее нельзя предсказать, возвращает или нет этот файл строки. Что делать? Проводить синтаксический анализ запроса для того, чтобы определить, какой тип он представляет? Это не очень просто. Совсем недостаточно проверить первое слово в строке, тем более, что это может быть комментарий: /* комментарий */ SELECT ... К счастью, совсем не обязательно знать тип запроса заранее для того, чтобы обработать его соответствующим образом. Интерфейс MySQL С API позволяет создавать профаммы, безошибочно обрабатывающие запросы любого типа, независимо от того, возвращает или не возвращает он результирующий набор. Перед тем как его создать, определим как он работает. Делаем запрос. Если он дает сбой, то выходим. Запрос срабатывает без ошибок. Для выборки строки с сервера и создания результирующего набора вызываем процедуру mysql store result() . Сбой процедуры mysql store result () может быть вызван тем, что запрос не возвращает результирующий набор или в процессе выборки произошла ошибка. Различить эти два результата можно, если вызвать функцию mysqlf ieldcount () и проверить результат, возвращаемый ею.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |