Основы программирования в Linux
В основном в случае функций
возврат 0 означает отсутствие измененных строк, а положительное значение указывает на реальный результат, обычно количество строк, затронутых оператором.mysql_Сначала следует создать таблицу
в вашей базе данныхchildren, если вы еще не сделали этого. Удалите (с помощью командыfoo) любую существующую таблицу, чтобы быть уверенным в том, что вы имеете дело с чистым определением таблицы, и повторно отправьте идентификаторы, применяемые в столбцеdrop.AUTO_INCREMENT$ <b>mysql -u rick -p foo</b>Enter password:Welcome to the MySQL monitor. Commands end with ; or \g.mysql> <b>DROP TABLE children;</b>Query OK, 0 rows affected (0.58 sec)mysql> <b>CREATE TABLE children (</b>-> <b>childno int(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,</b>-> <b>fname varchar(30),</b>-> <b>age int</b>-> <b>);</b>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;<i> int res;</i>mysql_init(&my_connection);if (mysql_real_connect(&my_connection, "localhost","rick", "secret", "foo", 0, NULL, 0)) {printf("Connection success\n");<i> res = mysql_query(&my_connection,</i><i> "INSERT INTO children(fname, age) VALUES('Ann', 3)");</i><i> if (!res) {</i><i> printf("Inserted %lu rows\n",</i><i> (unsigned long)mysql_affected_rows(&my_connection));</i><i> } else {</i><i> fprintf(stderr, "Insert error %d: %s\n",</i><i> mysql_errno(&my_connection), &mysql_error(&my_connection));</i><i> }</i>mysql_close(&my_connection);} else {fprintf(stderr, "Connection failed\n");if (mysql_errno(&my_connection)) {printf(stderr, "Connection error %d: %s\n",mysql_errno(&my_connection), mysql_error(&my_connection));}}return EXIT_SUCCESS;}Как и ожидалось, одна строка добавлена.
Теперь измените код, чтобы включить
вместоUPDATE, и посмотрите на сообщение об измененных строках.INSERTmysql_errno(&my_connection), mysql_error(&my_connection));}}<i>res = mysql_query(&my_connection,</i><i> "UPDATE children SET AGE = 4 WHERE fname = 'Ann'");</i>if (!res) {printf("Updated %lu rows\n",(unsigned long)mysql_affected_rows(&my_connection));} else {fprintf (stderr, "Update error %d: %s\n",mysql_errno(&my_connection), mysql_error(&my_connection));}Назовите эту программу update1.c. Она пытается задать возраст 4 года для всех детей с именем Ann.
Предположим, что ваша таблица
содержит следующие данные:childrenmysql> <b>SELECT * from CHILDREN;</b>+---------+--------+-----+| childno | fname | age |+---------+--------+-----+| 1 | Jenny | 21 || 2 | Andrew | 17 || 3 | Gavin | 9 || 4 | Duncan | 6 || 5 | Emma | 4 || 6 | Alex | 15 || 7 | Adrian | 9 || 8 | Ann | 3 || 9 | Ann | 4 || 10 | Ann | 3 || 11 | Ann | 4 |+---------+--------+-----+11 rows in set (0.00 sec)В вашей таблице есть четыре ребенка с именем Ann. Вы можете рассчитывать на то, что при выполнении программы update1 количество измененных строк будет равно четырем, т.е. числу строк, отбираемых по условию
. Но если вы выполните программу, то увидите отчет программы об изменении только двух строк, поскольку учитываются только те строки, данные которых действительно нуждались в корректировке. Можно выбрать более традиционный вариант отчета, используя флагWHEREв функцииCLIENT_FOUND_ROWS:mysql_real_connect