Литмир - Электронная Библиотека
Содержание  
A
A

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

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

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

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&gt; <b>DROP TABLE children;</b>

Query OK, 0 rows affected (0.58 sec)

mysql&gt; <b>CREATE TABLE children (</b>

    -&gt; <b>childno int(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,</b>

    -&gt; <b>fname varchar(30),</b>

    -&gt; <b>age int</b>

    -&gt; <b>);</b>

Query OK, 0 rows affected (0.09 sec)

mysql&gt;

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

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

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &quot;mysql.h&quot;

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

 MYSQL my_connection;

<i> int res;</i>

 mysql_init(&amp;my_connection);

 if (mysql_real_connect(&amp;my_connection, &quot;localhost&quot;,

  &quot;rick&quot;, &quot;secret&quot;, &quot;foo&quot;, 0, NULL, 0)) {

  printf(&quot;Connection success\n&quot;);

<i>  res = mysql_query(&amp;my_connection,</i>

<i>   &quot;INSERT INTO children(fname, age) VALUES('Ann', 3)&quot;);</i>

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

<i>   printf(&quot;Inserted %lu rows\n&quot;,</i>

<i>    (unsigned long)mysql_affected_rows(&amp;my_connection));</i>

<i>  } else {</i>

<i>   fprintf(stderr, &quot;Insert error %d: %s\n&quot;,</i>

<i>    mysql_errno(&amp;my_connection), &amp;mysql_error(&amp;my_connection));</i>

<i>  }</i>

  mysql_close(&amp;my_connection);

 } else {

  fprintf(stderr, &quot;Connection failed\n&quot;);

  if (mysql_errno(&amp;my_connection)) {

   printf(stderr, &quot;Connection error %d: %s\n&quot;,

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

  }

 }

 return EXIT_SUCCESS;

}

Как и ожидалось, одна строка добавлена.

Теперь измените код, чтобы включить

UPDATE
вместо
INSERT
, и посмотрите на сообщение об измененных строках.

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

 }

}

<i>res = mysql_query(&amp;my_connection,</i>

<i> &quot;UPDATE children SET AGE = 4 WHERE fname = 'Ann'&quot;);</i>

if (!res) {

 printf(&quot;Updated %lu rows\n&quot;,

  (unsigned long)mysql_affected_rows(&amp;my_connection));

} else {

 fprintf (stderr, &quot;Update error %d: %s\n&quot;,

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

}

Назовите эту программу update1.c. Она пытается задать возраст 4 года для всех детей с именем Ann.

Предположим, что ваша таблица

children
содержит следующие данные:

mysql&gt; <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
:

149
{"b":"285844","o":1}