Читать интересную книгу Основы программирования в Linux - Мэтью Нейл

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 147 148 149 150 151 152 153 154 155 ... 324

   fprintf(stderr, "Insert error %d: %sn",

    mysql_errno(&myconnection), mysql_error(&my_connection));

  }

<i>  res = mysql_query(&amp;my_connection, &quot;SELECT LAST INSERT ID()&quot;);</i>

<i>  if (res) {</i>

<i>   printf(&quot;SELECT error %sn&quot;, mysql_error(&amp;my_connection);</i>

<i>  } else {</i>

<i>   res_ptr= mysql_use_result(&amp;my_connection);</i>

<i>   if (res_ptr) {</i>

<i>    while ((sqlrow = mysql_fetch_row(res_ptr))) {</i>

<i>     printf(&quot;We inserted childno %sn&quot;, sqlrow[0]);</i>

<i>    }</i>

<i>    mysql_free_result(res_ptr);</i>

<i>   }</i>

<i>  }</i>

  mysql_close(&amp;my_connection);

 } else {

  fprintf(stderr, &quot;Connection failedn&quot;);

  if (mysql_errno(&amp;my_connection)) {

   fprintf(stderr, &quot;Connection error %d: %sn&quot;,

    mysql_errno(&amp;my_connection), mysql_error(&amp;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 success

Inserted 1 rows

We inserted childno 6

$ <b>./insert2</b>

Connection success

Inserted 1 rows

We inserted childno 7

Как это работает

После вставки строки вы извлекаете выделенный ID, применив функцию LAST_INSERT_ID() в обычном операторе SELECT. Затем вы использовали функцию mysql_use_result(), которую мы вскоре поясним, для извлечения данных из выполненного вами оператора SELECT и вывели их на экран. Сейчас не задумывайтесь всерьез о механизме извлечения значений, на следующих нескольких страницах мы дадим нужные пояснения.

Операторы, возвращающие данные

Основное назначение языка — конечно, извлечение данных, а не их добавление или обновление. Данные извлекаются с помощью оператора SELECT.

Примечание

MySQL также поддерживает SQL-операторы SHOW, DESCRIBE и EXPLAIN, предназначенные для возврата результатов, но мы не собираемся рассматривать их в данной книге. Как обычно, в руководстве можно найти описание этих операторов.

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

1. Выполнение запроса.

2. Извлечение данных.

3. Обработка этих данных.

4. Наведение порядка при необходимости.

Так же, как в случае операторов INSERT и DELETE, вы воспользуетесь функцией mysql_query для отправки SQL-запроса. Далее вы извлечете данные о помощью функций 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, если оператор завершился аварийно.

В случае успеха вы далее вызываете функцию mysql_num_rows для определения количества возвращенных записей, которое, мы надеемся, будет положительным числом, но может быть и 0, если ни одной строки не возвращено.

<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. Давайте рассмотрим их.

1 ... 147 148 149 150 151 152 153 154 155 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

Оставить комментарий