Основы программирования в Linux
fprintf(stderr, "Insert error %d: %s\n",mysql_errno(&myconnection), mysql_error(&my_connection));}<i> res = mysql_query(&my_connection, "SELECT LAST INSERT ID()");</i><i> if (res) {</i><i> printf("SELECT error %s\n", mysql_error(&my_connection);</i><i> } else {</i><i> res_ptr= mysql_use_result(&my_connection);</i><i> if (res_ptr) {</i><i> while ((sqlrow = mysql_fetch_row(res_ptr))) {</i><i> printf("We inserted childno %s\n", sqlrow[0]);</i><i> }</i><i> mysql_free_result(res_ptr);</i><i> }</i><i> }</i>mysql_close(&my_connection);} else {fprintf(stderr, "Connection failed\n");if (mysql_errno(&my_connection)) {fprintf(stderr, "Connection error %d: %s\n",mysql_errno(&my_connection), mysql_error(&my_connection));}}return EXIT_SUCCESS;}Далее приведен вывод:
$ <b>gcc -I/usr/include/mysql insert2.c -L/usr/lib/mysql -lmysqlclient -o insert2</b>$ <b>./insert2</b>Connection successInserted 1 rowsWe inserted childno 6$ <b>./insert2</b>Connection successInserted 1 rowsWe inserted childno 7Как это работает
После вставки строки вы извлекаете выделенный ID, применив функцию
в обычном оператореLAST_INSERT_ID(). Затем вы использовали функциюSELECT, которую мы вскоре поясним, для извлечения данных из выполненного вами оператораmysql_use_result()и вывели их на экран. Сейчас не задумывайтесь всерьез о механизме извлечения значений, на следующих нескольких страницах мы дадим нужные пояснения.SELECTОператоры, возвращающие данныеОсновное назначение языка — конечно, извлечение данных, а не их добавление или обновление. Данные извлекаются с помощью оператора
.SELECTПримечаниеMySQL также поддерживает SQL-операторы
,SHOWиDESCRIBE, предназначенные для возврата результатов, но мы не собираемся рассматривать их в данной книге. Как обычно, в руководстве можно найти описание этих операторов.EXPLAINПолучение данных в вашем приложении на языке С обычно будет включать четыре шага:
1. Выполнение запроса.
2. Извлечение данных.
3. Обработка этих данных.
4. Наведение порядка при необходимости.
Так же, как в случае операторов
иINSERT, вы воспользуетесь функциейDELETEдля отправки SQL-запроса. Далее вы извлечете данные о помощью функцийmysql_queryилиmysql_store_resultв зависимости от того, как хотите получить данные. Затем будет применена последовательность вызовов функцииmysql_use_resultдля обработки данных. И наконец, вы используете функциюmysql_fetch_rowдля очистки памяти, которая применялась для выполнения вашего запроса.mysql_free_resultРазница между функциями
иmysql_use_resultв основном определяется тем, хотите ли вы получать данные построчно или весь набор за один шаг. Последний вариант больше подходит в том случае, когда вы рассчитываете на не слишком большой результирующий набор.mysql_store_resultФункции для извлечения всех данных сразуВы сможете извлечь в единственном вызове все данные из оператора
(или другого оператора, возвращающего данные), применяя функциюSELECT:mysql_store_result
<b>MYSQL_RES *mysql_store_result(MYSQL* connection);</b>Ясно, что вам понадобится эта функция после успешного вызова функции
. Она немедленно сохранит все возвращенные данные в клиентской части. Функция вернет указатель на новую структуру, называемую структурой результирующего набора, илиmysql_query, если оператор завершился аварийно.NULLВ случае успеха вы далее вызываете функцию
для определения количества возвращенных записей, которое, мы надеемся, будет положительным числом, но может быть и 0, если ни одной строки не возвращено.mysql_num_rows<b>my_ulonglong mysql_num_rows(MYSQL_RES* result);</b>Эта функция принимает в качестве параметра структуру с результатом, возвращенную
, и возвращает количество строк в данном результирующем наборе. Если функцияmysql_store_resultзавершилась успешно, функцияmysql_store_resultтакже завершится успешно.mysql_num_rowsДанная комбинация функций — легкий способ извлечь нужные вам данные. На этом этапе все данные локальны для программы-клиента и вам не нужно больше поддерживать подключение, связанное с возможностью возникновения ошибок в сети или базе данных. Получив количество возвращенных строк, вы упростите последующий программный код.
Если окажется, что вы должны работать с особенно большим набором данных, лучше извлекать меньшие по объему, более управляемые порции данных. В этом случае приложению быстрее передается управление, и использование сетевых ресурсов будет более щадящим. Мы рассмотрим этот вариант подробнее при обсуждении функции
.mysql_use_resultТеперь, когда у вас есть данные, можно обработать их с помощью функции
и перемещаться по набору, используя функцииmysql_fetch_row,mysql_data_seekиmysql_row_seek. Давайте рассмотрим их.mysql_row_tell