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

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

Жанры

Основы программирования в 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 {

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

Ваше Сиятельство 9

Моури Эрли
9. Ваше Сиятельство
Фантастика:
боевая фантастика
попаданцы
стимпанк
аниме
фэнтези
5.00
рейтинг книги
Ваше Сиятельство 9

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Гранит науки. Том 2

Зот Бакалавр
2. Героями не становятся, ими умирают
Фантастика:
фэнтези
5.00
рейтинг книги
Гранит науки. Том 2

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Меченный смертью. Том 4

Юрич Валерий
4. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Меченный смертью. Том 4

Ночной администратор

Ле Карре Джон
Детективы:
шпионские детективы
7.14
рейтинг книги
Ночной администратор

Господин Хладов

Шелег Дмитрий Витальевич
4. Кровь и лёд
Фантастика:
аниме
5.00
рейтинг книги
Господин Хладов

Адвокат Империи 12

Карелин Сергей Витальевич
12. Адвокат империи
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
попаданцы
5.00
рейтинг книги
Адвокат Империи 12

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

Адвокат Империи 8

Карелин Сергей Витальевич
8. Адвокат империи
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
фантастика: прочее
попаданцы
5.00
рейтинг книги
Адвокат Империи 8

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

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

Маг

Щепетнов Евгений Владимирович
2. Истринский цикл
Фантастика:
фэнтези
8.57
рейтинг книги
Маг

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

"Новый Михаил-Империя Единства". Компиляцияя. Книги 1-17

Марков-Бабкин Владимир
Избранные циклы фантастических романов
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Новый Михаил-Империя Единства. Компиляцияя. Книги 1-17