Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Когда MySQL вставляет данные в столбец типа AUTO_INCREMENT
, она отслеживает для каждого пользователя последнее присвоенное ею значение. Программы пользователей могут узнать его, просто используя в операторе SELECT
специальную функцию LAST_INSERT_ID()
, которая действует немного похоже на псевдостолбец.
Выполните упражнение 8.2.
AUTO_INCREMENT
Вы сможете увидеть, как это работает, вставив несколько значений в вашу таблицу и затем применив функцию LAST_INSERT_ID()
.
mysql> INSERT INTO children(fname, age) VALUES('Tom', 13);
Query OK, 1 row affected (0.06 sec)
mysql> SELECT LAST_INSERT_ID();
+------------------+
| last_insert_id() |
+------------------+
| 14 |
+------------------+
1 row in set (0.01 sec)
mysql> INSERT INTO children(fname, age) VALUES('Harry', 17);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT LAST_INSERT_ID();
+------------------+
| last_insert_id() |
+------------------+
| 15 |
+------------------+
1 row in set (0.00 sec)
mysql>
Как это работает
При каждой вставке строки MySQL выделяет новое значение для столбца id
и запоминает его, поэтому вы сможете узнать это значение с помощью функции LAST_INSERT_ID()
.
Если хотите поэкспериментировать, чтобы убедиться в уникальности возвращаемого номера в вашем сеансе, откройте еще один сеанс и вставьте другую строку. В исходном сеансе повторите выполнение оператора SELECT LAST_INSERT_ID();
. Вы увидите, что номер не изменился, поскольку возвращаемый номер — последний, добавленный в текущем сеансе. Но если вы выполните оператор SELECT * FROM children
, то увидите, что в другом сеансе действительно были вставлены данные.
Выполните упражнение 8.3.
В этом примере вы измените вашу программу insert1.c, чтобы посмотреть, как она работает на С. Ключевые изменения выделены цветом. Назовите откорректированную программу insert2.c.
#include
#include
#include "mysql.h"
int main(int argc, char *argv[]) {
MYSQL my_connection;
MYSQL_RES* res_ptr;
MYSQL_ROW sqlrow;
int res;
mysql_init(&myconnection);
if (mysql_real_connect(&my_connection, "localhost",
"rick", "bar", "rick", 0, NULL, 0)) {
printf("Connection success\n");
res = mysql_query(&my_connection,
"INSERT INTO children(fname, age) VALUES('Robert', 7)");
if (!res) {
printf("Inserted %lu rows\n",
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr, "Insert error %d: %s\n",
mysql_errno(&myconnection), mysql_error(&my_connection));
}
res = mysql_query(&my_connection, "SELECT LAST INSERT ID()");
if (res) {
printf("SELECT error %s\n", mysql_error(&my_connection);
} else {
res_ptr= mysql_use_result(&my_connection);
if (res_ptr) {
while ((sqlrow = mysql_fetch_row(res_ptr))) {
printf("We inserted childno %s\n", sqlrow[0]);
}
mysql_free_result(res_ptr);
}
}
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;
}
Далее приведен вывод:
$ gcc -I/usr/include/mysql insert2.c -L/usr/lib/mysql -lmysqlclient -o insert2
$ ./insert2
Connection success
Inserted 1 rows
We inserted childno 6
$ ./insert2
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
:
MYSQL_RES *mysql_store_result(MYSQL* connection);
Ясно, что вам понадобится эта функция после успешного вызова функции mysql_query
. Она немедленно сохранит все возвращенные данные в клиентской части. Функция вернет указатель на новую структуру, называемую структурой результирующего набора, или NULL
, если оператор завершился аварийно.
В случае успеха вы далее вызываете функцию mysql_num_rows
для определения количества возвращенных записей, которое, мы надеемся, будет положительным числом, но может быть и 0, если ни одной строки не возвращено.
my_ulonglong mysql_num_rows(MYSQL_RES* result);
Эта функция принимает в качестве параметра структуру с результатом, возвращенную mysql_store_result
, и возвращает количество строк в данном результирующем наборе. Если функция mysql_store_result
завершилась успешно, функция mysql_num_rows
также завершится успешно.
Данная комбинация функций — легкий способ извлечь нужные вам данные. На этом этапе все данные локальны для программы-клиента и вам не нужно больше поддерживать подключение, связанное с возможностью возникновения ошибок в сети или базе данных. Получив количество возвращенных строк, вы упростите последующий программный код.
Читать дальшеИнтервал:
Закладка: