在mysql数据库中使用C执行sql语句的方法
它们将讨论返回数据的语句,例如不返回数据的INSERT和语句,如UPDATE和删除,然后编写简单的程序来从数据库中检索数据。执行SQL语句
现在我们有一个连接,知道如何处理错误,它的时间来讨论使用我们的数据库的一些实际工作,执行所有类型的SQL的主要关键是mysql_query:
国际mysql_query(mysql *连接,const char *查询)
你可以看到,它是非常简单的,它需要一个指针的连接结构以及包含SQL执行的文本字符串;不同的命令行工具,结束分号将不能使用。成功后,返回到0。在特殊情况下,二进制数据的需要,相关函数,mysql_real_query,可以使用。尽管本章的目的,我们只需要讨论mysql_query。
不返回数据的sql语句
我们将首先讨论更新、删除和插入语句。因为它们不返回数据,所以更容易使用。
我们将在这里介绍的另一个重要函数是检查受影响的行数的函数:
my_ulonglong mysql_affected_rows(mysql *连接);
也许这个功能最明显的地方是它的不寻常的回报。由于其便携性,这是一个特殊的符号类型。为了使用printf,建议把它逼到无符号长整数,使用%路格式规范。这个函数返回行由以前的更新,插入数的影响,或删除查询,这是通过使用mysql_query。
通常为mysql_函数,返回代码0表示没有行受影响;阳性数是实际的结果,通常受影响的行数。
如前所述,也许会有意想不到的结果时,mysql_affected_rows使用。让我们讨论通过INSERT语句影响的行数,并将操作如预期,将下面的代码添加到程序connect2。C,叫它insert1 C:
复制代码代码如下所示:
#包括
#包括
#包括MySQL。H
int main(int argc、argv { } { char *)
MySQL my_connection;
Int res;
mysql_init(my_connection);
如果(mysql_real_connect(my_connection,localhost)
瑞克
printf(连接成功;
RES = mysql_query(my_connection,
插入(名儿童,年龄),
值('ann ',3));
如果(!RES){
printf(插入%lu行
(长整型)mysql_affected_rows(my_connection));
{人}
Fprintf(stderr,插入错误%d:S
(my_connection),
mysql_error(my_connection));
}
mysql_close(my_connection);
{人}
Fprintf(stderr,连接失败;
如果(mysql_errno(my_connection)){
Fprintf(stderr,连接错误%d:%s
mysql_errno(my_connection),
mysql_error(my_connection));
}
}
返回exit_success;
}
如预期的那样,插入的行数为1。
现在,我们改变的代码,所以the'insert'part所取代:
复制代码代码如下所示:
mysql_errno(my_connection),mysql_error(my_connection));
}
}
RES = mysql_query(my_connection,更新儿童年龄= 4
在'ann名=);
如果(!RES){
printf(更新%lu行
(长整型)mysql_affected_rows(my_connection));
{人}
Fprintf(stderr,更新错误%d:%s
mysql_errno(my_connection),
mysql_error(my_connection));
}
现在假设一些数据在子表,如下:
childno
名
年龄
一
二
三
四
五
六
七
八
九
十
十一
珍妮
安得烈
加文
邓肯
艾玛
亚历克斯
阿德里安
安
安
安
安
十四
十
四
二
零
十一
五
三
四
三
四
如果我们执行我们,我们希望受影响的行数是4,但事实上,程序报告2,因为它只需要改变2行,虽然WHERE子句标识4行。如果你想mysql_affected_rows结果是4的报告,这可能是熟悉其他数据库的期望记住,你需要通过client_found_rows旗mysql_real_connect,和活动的程序,如下:
复制代码代码如下所示:
如果(mysql_real_connect(my_connection,localhost)
瑞克
如果我们重置数据库中的数据,然后用这个修改来运行程序,它报告的行数是4。
关于函数的mysql_affected_rows最后奇怪的是,它发生时,数据从数据库中删除。如果WHERE子句中使用,mysql_affected_rows将预期返回的行数。然而,如果没有WHERE子句,所有行被删除,并通过报告受影响的行数为0。这是因为整个表格被删除由于效率的原因,这种行为是不被client_found_rows选项标志的影响。
返回数据的语句
现在是讨论SQL最常用用法的时候了,SQL是从数据库检索数据的SELECT语句。
MySQL还支持显示、描述和解释返回结果的SQL语句,但这里不考虑它们。
你会记得从PostgreSQL的章,你可以从SQL SELECT语句检索数据在PQexec,立即得到所有的数据,或使用游标,一步一步一步从数据库检索数据,从而获得大数据。
出于同样的原因,MySQL的检索方法几乎是相同的,尽管它并没有用游标的形式来描述一行一行的检索,但是它提供了一种API,可以减少两种方法之间的差异,如果需要,它通常使这两种方法的交换更容易。
一般来说,从MySQL数据库中检索数据有4个阶段:
发出一个查询
检索数据
数据处理
执行所需的任何安排
之前,我们用mysql_query发出查询,数据检索是通过mysql_store_result或mysql_use_result完成,取决于如何获取数据,然后使用mysql_fetch_row调用顺序处理数据。最后,你必须调用mysql_free_result让MySQL进行任何所需的排序。
所有即时数据检索的功能
所有的数据可从SELECT语句(或其他语句返回的数据),在一个单一的电话,用mysql_store_result:
复制代码代码如下所示:
mysql_res * mysql_store_result(mysql *连接);
该功能必须在mysql_query检索存储数据的结果集调用。这个功能从服务器和存储它立即在客户端检索所有数据。它返回一个指向一个结构(结果集的结构),我们从来没有遇到过。如果语句失败,空返回。
当等效PostgreSQL使用,要知道,返回null表示发生了错误,这是不同的情况下,数据是不能进行检索。甚至如果返回值不为空,但这不意味着我现在要处理的数据。
如果空是不能退的,你可以叫mysql_num_rows和检索实际返回的行数,其中,当然,可能是0。
复制代码代码如下所示:
my_ulonglong mysql_num_rows(mysql_res *结果);
得出结构从mysql_store_result返回,返回的结果集的行数,行数可为0。如果mysql_store_result成功,mysql_num_rows永远是成功的。
本文结合mysql_store_result和mysql_num_rows是简单和直接的方式来检索数据。一旦mysql_store_result成功返回,所有查询的数据存储在客户端,我们知道它可以检索结果结构无需担心数据库或网络错误,因为程序的所有的数据都是本地的。返回的行数也可以立即发现,这使得它更容易进行编码。如前所述,它将结果返回到客户端立即。为大的结果集,它可以消耗大量的服务器、网络和客户资源。由于这些原因,最好是使用一个更大的数据集时,只检索需要的数据。很快,我们将讨论如何使用MySQL_use_result函数来做这个。
一旦数据被检索,mysql_fetch_row可用于检索和使用的mysql_data_seek,mysql_row_seek,和mysql_row_tell操作的结果集。在我们开始之前对数据进行检索的阶段,让我们讨论一下这些功能。
复制代码代码如下所示:
mysql_row mysql_fetch_row(mysql_res *结果);
这个函数使用从存储结果获得的结果结构,从中检索一行,并返回行结构中分配给您的数据。当没有更多的数据或错误时,返回null。
复制代码代码如下所示:
无效mysql_data_seek(mysql_res *结果,my_ulonglong偏移);
这个功能允许你输入的结果集与集的行,将由下一个收购操作返回的行数。偏移,必须减少1的行数从0到结果集。通过0将导致在第一行返回下一个电话是在mysql_fetch_row。
复制代码代码如下所示:
mysql_row_offest mysql_row_tell(mysql_res *结果);
这个函数返回一个偏移值表示结果集的当前位置。它不是一个线号不能用于mysql_data_seek.however,可如下:
复制代码代码如下所示:
mysql_row_offset mysql_row_seek(mysql_res *结果,mysql_row_offset偏移);
它移动结果集的当前位置并返回到前面的位置。
有时,这双功能是有用的已知点在结果集之间跳来跳去。注意,你不要混淆的偏移值,用行告诉和行用data_seek.these行号寻求不可交换,其结果将是你想看到的。
复制代码代码如下所示:
无效mysql_free_result(mysql_res *结果);
当结果集完成时,函数必须始终被调用,以允许MySQL库组织分配给它的对象。
检索数据
现在开始写从数据库中检索数据的第一个程序。我们将选择所有行以上的含量超过5。不幸的是,我们不知道如何处理这些数据,所以我们唯一能做的就是在一个循环中找回它。这是C的:
复制代码代码如下所示:
#包括
#包括
#包括MySQL。H
MySQL my_connection;
mysql_res * res_ptr;
mysql_row sqlrow;
int main(int argc、argv { } { char *)
Int res;
mysql_init(my_connection);
如果(mysql_real_connect(my_connection,localhost
printf(连接成功;
RES = mysql_query(my_connection,选择childno,名,
年龄在5岁以上儿童的年龄;
如果(RES){
printf(选择错误:%s
{人}
res_ptr = mysql_store_result(my_connection);
如果(res_ptr){
printf(检索% luows
而(((sqlrow = mysql_fetch_row(res_ptr))){
Printf (Fetched data... ;
}
如果(mysql_errno(my_connection)){
Fprintf(stderr,检索错误:S
}
}
mysql_free_result(res_ptr);
}
mysql_close(my_connection);
{人}
Fprintf(stderr,连接失败;
如果(mysql_errno(my_connection)){
Fprintf(stderr,连接错误%d:%s
mysql_errno(my_connection),mysql_error(my_connection));
}
}
返回exit_success;
}
检索结果集和循环通过检索的数据的重要部分已被高亮显示。
每次检索一行数据。
而不是立即得到所有的数据存储在客户端,我们需要的不是mysql_use_result mysql_store_result检索数据。
复制代码代码如下所示:
mysql_res * mysql_use_result(mysql *连接);
此功能还需要一个连接对象并返回结果将返回null指针,或当它是错的。类似mysql_store_result,它返回的指针指向的结果集对象。关键的区别在于,实际上在返回结果时没有将数据检索到结果集,但是初始化结果集用于准备检索数据。
参考材料
你可以参考本文在developerWorks全球网站的英文文本。
本文是从Linux的专业书Wrox出版社有限公司出版第五章
关于作者
Rick Stones是一个系统的设计师,在一个大的泛欧洲的医药配送和分销公司的IT部门工作。1985年以来,他一直使用各种形式的UNIX和发现Linux与early.99光盘释放。他写软件的UNIX,Linux,和其他各种语言的平台,以及安装和管理Linux的几种服务器。在自己有限的空余时间,他试图提高自己的钢琴技巧。
自大学时代开始接触C和UNIX V6,Neil Matthew已经有20年多的UNIX和Linux的经验。此后,他一直在IT行业工作,主要从事通信软件的开发,并一直热衷于深刻的编程语言和开发技术。现在,作为一个系统设计师,他建议的技术战略和QA。他渴望在公司建立一个Linux的商业案例。在业余时间,写作或骑着马,尼尔试图说服他的妻子和两个孩子和他一起散步在乡下。尼尔曾参与写作的Wrox出版社出版几本书,其中最著名的是linux编程的共同工作专业linux编程。