与 PostgreSQL 相似可使用许多不同的语言来访问 MySQL包括 CC++Java 和 Perl从 Professional Linux Programming 中第 章有关 MySQL 的下列章节中Neil Matthew 和 Richard Stones 使用详尽的 MySQL C 接口向我们介绍了如何在 MySQL 数据库中执行 SQL 语句他们将看看返回数据的语句例如 INSERT 以及不返回数据的语句例如 UPDATE 和 DELETE然后他们将编写从数据库检索数据的简单程序
执行 SQL 语句
现在我们已经有了一个连接并且知道如何处理错误是时候讨论使用我们的数据库来作一些实际工作了执行所有类型的 SQL 的主关键字是 mysql_query
int mysql_query(MYSQL *connection const char *query)
正如您所见它非常简单它取一个指向连接结构的指针和包含要执行的 SQL 的文本字符串与命令行工具不同将不使用结束分号成功之后返回 在需要包含二进制数据的特殊情况下可以使用相关的函数mysql_real_query虽然出于本章的目的我们仅需要讨论 mysql_query
不返回数据的 SQL 语句
我们将先讨论 UPDATEDELETE 和 INSERT 语句因为它们不返回数据所以更易于使用
这里我们将介绍的另一个重要函数是检查受影响的行数的函数
my_ulonglong mysql_affected_rows(MYSQL *connection);
可能关于这一函数的最显而易见的事就是其非同寻常的返回结果由于可移植性原因这是一个特殊的无符号类型为了在 printf 中使用建议将其强制转换成使用 %lu 格式规范的无符号长整数这个函数返回受以前的 UPDATEINSERT 或 DELETE 查询影响的行数这些查询是使用 mysql_query 执行的
通常对于 mysql_ 函数返回码 表示没有行受影响正数表示实际结果通常是受影响的行数
如前所述当使用 mysql_affected_rows 时可能出现未期望的结果让我们先讨论受 INSERT 语句影响的行数它将按预期进行操作将下列代码添加到程序 connectc 中并且称其为 insertc
#include #include #include mysqlh
int main(int argc char *argv[]) {
MYSQL my_connection;
int res;
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection localhost
rick bar rick NULL )) {
printf(Connection success\n);
res = mysql_query(&my_connection INSERT INTO children(fnameage)
VALUES(Ann));
if (!res) {
printf(Inserted %lu rows\n
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr Insert error %d: s\nmysql_errno(&my_connection)
mysql_error(&my_connection));
}
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;
}
正如预期插入的行数为
现在我们更改代码所以 insert 部分被替换成
mysql_errno(&my_connection) mysql_error(&my_connection));
}
}
res = mysql_query(&my_connection UPDATE children SET AGE =
WHERE fname = Ann);
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)