Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

printf("Connection success\n");

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;

}

Вы смогли легко решить проблему, устранив перезапись вашего дескриптора подключения результатом, возвращаемым при аварийном завершении

mysql_real_connect
. И кроме того, это отличный пример еще одного способа применения структур дескрипторов подключения. Вы можете вызвать ошибку, выбрав некорректное имя пользователя или пароль, и получите код ошибки, подобный предлагаемому монитором
mysql
:

$ ./connect2

Connection failed

Connection error 1045: Access denied for user: 'rick@localhost' (Using password: YES)

$

Выполнение SQL-операторов

Теперь, когда вы можете подключаться к вашей базе данных и корректно обрабатывать ошибки, самое время дать вашей программе реальную работу. У основной функции API, предназначенной для выполнения операторов языка SQL, подходящее имя.

int mysql_query(MYSQL *connection, const char *query);

He слишком сложная? Эта подпрограмма принимает указатель на дескриптор подключения и несколько, хочется надеяться, корректных SQL-операторов в виде текстовой строки (без завершения каждого из них точкой с запятой, как в мониторе

mysql
). В случае удачного завершения возвращается ноль. Вторую подпрограмму
mysql_real_query
можно применять при запросе двоичных данных, но в этой главе мы используем только подпрограмму
mysql_query
.

SQL-операторы, не возвращающие данных

Для простоты начнем с рассмотрения нескольких SQL-операторов, которые не возвращают данные:

UPDATE
,
DELETE
и
INSERT
.

Еще одна важная функция, которую мы рассмотрим, проверяет количество строк, затронутых запросом:

my_ulonglong mysql_affected_rows(MYSQL *connection);

Первое, что вы, вероятно, заметили в этой функции, — очень необычный тип возвращаемых данных. Из соображений переносимости применяется беззнаковый (unsigned) тип. Когда используется функция

printf
, рекомендуется приводить его к типу
unsigned long
(длинное беззнаковое) со спецификатором формата
%lu
. Эта функция возвращает количество строк, измененных предварительно выполненным запросом
UPDATE
,
INSERT
или
DELETE
. Возвращаемое значение, используемое в MySQL, может вас, озадачить, если у вас есть опыт работы с другими базами данных SQL. СУРБД MySQL возвращает количество строк, действительно измененных обновлением, в то время как многие другие СУБД будут считать запись измененной просто потому, что она соответствует одному из условий
WHERE
.

В основном в случае функций

mysql_
возврат 0 означает отсутствие измененных строк, а положительное значение указывает на реальный результат, обычно количество строк, затронутых оператором.

Сначала следует создать таблицу

children
в вашей базе данных
foo
, если вы еще не сделали этого. Удалите (с помощью команды
drop
) любую существующую таблицу, чтобы быть уверенным в том, что вы имеете дело с чистым определением таблицы, и повторно отправьте идентификаторы, применяемые в столбце
AUTO_INCREMENT
.

$ mysql -u rick -p foo

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

mysql> DROP TABLE children;

Query OK, 0 rows affected (0.58 sec)

mysql> CREATE TABLE children (

– > childno int(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,

– > fname varchar(30),

– > age int

– > );

Query OK, 0 rows affected (0.09 sec)

mysql>

Теперь добавьте программный код в файл connect2.c, для того чтобы вставить новую строку в вашу таблицу. Назовите эту новую программу insert1.с. Учтите, что разбиение оператора на несколько строк объясняется физической шириной страницы; обычно вы не должны разбивать реальный SQL-оператор, если он не слишком длинный, в этом случае можно применить символ

/
в конце строки для переноса оставшейся части SQL-оператора на следующую строку.

#include <stdlib.h>

#include <stdio.h>

#include "mysql.h"

int main(int argc, char *argv[]) {

 MYSQL my_connection;

 int res;

 mysql_init(&my_connection);

 if (mysql_real_connect(&my_connection, "localhost",

"rick", "secret", "foo", 0, NULL, 0)) {

printf("Connection success\n");

res = mysql_query(&my_connection,

"INSERT INTO children(fname, age) VALUES('Ann', 3)");

if (!res) {

printf("Inserted %lu rows\n",

(unsigned long)mysql_affected_rows(&my_connection));

} else {

Поделиться:
Популярные книги

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Кир Булычев. Собрание сочинений в 18 томах. Т.9

Булычев Кир
Собрания сочинений
Фантастика:
альтернативная история
6.00
рейтинг книги
Кир Булычев. Собрание сочинений в 18 томах. Т.9

Глобус 1976

Коллектив авторов
Приключения:
путешествия и география
7.00
рейтинг книги
Глобус 1976

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Хроники Сиалы. Трилогия

Пехов Алексей Юрьевич
Хроники Сиалы
Фантастика:
фэнтези
9.03
рейтинг книги
Хроники Сиалы. Трилогия

Локки 9. Потомок бога

Решетов Евгений Валерьевич
9. Локки
Фантастика:
фэнтези
попаданцы
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 9. Потомок бога

"Фантастика 2024-179". Компиляция. Книги 1-30

Уленгов Юрий
Фантастика 2024. Компиляция
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2024-179. Компиляция. Книги 1-30

Таежный гамбит

Достовалов Юрий
Сибириада
Приключения:
исторические приключения
6.25
рейтинг книги
Таежный гамбит

Россия молодая

Герман Юрий Павлович
Полное издание в одном томе
Проза:
историческая проза
6.57
рейтинг книги
Россия молодая

Северные сказки

Сборник
Детские:
сказки
5.00
рейтинг книги
Северные сказки

Война Хонор

Вебер Дэвид Марк
10. Хонор Харрингтон
Фантастика:
космическая фантастика
8.67
рейтинг книги
Война Хонор

Газлайтер. Том 40

Володин Григорий Григорьевич
40. История Телепата
Фантастика:
альтернативная история
аниме
попаданцы
6.25
рейтинг книги
Газлайтер. Том 40

Марш через джунгли

Вебер Дэвид Марк
1. Империя человека
Фантастика:
космическая фантастика
6.86
рейтинг книги
Марш через джунгли

Симеон Гордый

Балашов Дмитрий Михайлович
4. Государи московские
Научно-образовательная:
история
7.89
рейтинг книги
Симеон Гордый