分类: Mysql/postgreSQL
2008-03-28 10:51:16
来源:IBM developerWorks 中国网站 作者:sixth |
与PostgreSQL相似,可使用许多不同的语言来访问MySQL,包括C、C++、Java和Perl。从下列章节中,Neil Matthew和Richard Stones使用详尽的MySQL C接口向我们介绍了如何在MySQL数据库中执行SQL语句。他们将讨论返回数据的语句,例如INSERT以及不返回数据的语句,例如UPDATE和 DELETE。然后,他们将编写从数据库检索数据的简单程序。 "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", "bar", "rick", 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 {
fprintf(stderr, "Insert error %d: s\n",mysql_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_error(&my_connection));
} }
res = mysql_query(&my_connection,
"UPDATE children SET AGE = 4
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),
mysql_error(&my_connection));
} 2 3 4 5 6 7 8 9 10 11 Andrew Gavin Duncan Emma Alex Adrian Ann Ann Ann Ann 10 4 2 0 11 5 3 4 3 4 "rick", "bar", "rick", 0, NULL, CLIENT_FOUND_ROWS)) { |
如果我们在数据库中复位数据,然后运行带有这种修改的程序,则它报告的行数为4。
函数mysql_affected_rows还有最后一个奇怪之处,它发生在从数据库中删除数据时。如果使用WHERE子句,则 mysql_affected_rows将按预期返回删除行数。但是,如果没有WHERE子句,则删除所有行,报告受影响的行数却为0。这是因为由于效率原因优化删除整个表。这种行为不受CLIENT_FOUND_ROWS选项标志的影响。
现在是时候讨论SQL的最普遍用法了,从数据库检索数据的SELECT语句。
MySQL 还支持返回结果的SHOW、DESCRIBE和EXPLAIN SQL语句,但是这里不考虑它们。按惯例,手册中包含这些语句的说明。
您将会从PostgreSQL章记起,可以从PQexec中的SQL SELECT 语句检索数据,这里马上获取所有数据,或者使用游标从数据库中逐行检索数据,以便搞定大数据。
由于完全相同的原因,MySQL的检索方法几乎完全相同,虽然它实际上不用游标的形式描述逐行检索。但是,它提供了缩小这两种方法间差异的API,如果需要,它通常使两种方法的互换更加容易。
通常,从MySQL数据库中检索数据有4个阶段:
发出查询
检索数据
处理数据
执行所需的任何整理
象以前一样,我们使用mysql_query发出查询。数据检索是使用mysql_store_result或mysql_use_result完成的,这取决于想如何检索数据,随后使用mysql_fetch_row调用序列来处理数据。最后,必须调用mysql_free_result以允许 MySQL执行任何所需的整理。
全部立即数据检索的函数
可以从SELECT语句(或其他返回数据的语句)中检索完所有数据,在单一调用中,使用mysql_store_result:
|
必须在mysql_query检索数据后才能调用这个函数,以在结果集中存储该数据。这个函数从服务器中检索所有数据并立即将它存储在客户机中。它返回一个指向以前我们从未遇到过的结构(结果集结构)的指针。如果语句失败,则返回NULL。
使用等价的PostgreSQL时,应该知道返回NULL意味着已经发生了错误,并且这与未检索到数据的情况不同。即使,返回值不是NULL,也不意味着当前有数据要处理。
如果未返回NULL,则可以调用mysql_num_rows并且检索实际返回的行数,它当然可能是0。
|
|
|
|
这个函数返回一个偏移值,它表示结果集中的当前位置。它不是行号,不能将它用于mysql_data_seek。但是,可将它用于:
检索结果集并循环通过已检索的数据的重要部分都已突出显示。 一次检索一行数据 要按需要逐行检索数据,而不是立即获取全部数据并将它存储在客户机中,可以将mysql_store_result调用替换成 mysql_use_result:
这个函数还取得一个连接对象并返回结果结合指针,或者出错时返回NULL。与mysql_store_result相似,它返回指向结果集对象的指针;关键的不同点在于返回时,实际上没有将任何数据检索到结果集,只是初始化结果集以准备好检索数据。 |