再见西城 发表于 2015-1-16 22:45:29

MYSQL网站制作之在MySQL数据库中利用C实行SQL语句

“MySQL实际上是一个数据库家族,你可以从选择一个并将其配置成可以满足你的大多数情况,”开源顾问公司Ethiqa的总裁如此表示,“因此,你可以在开始的时候选择一个小巧的版本产品,以后再根据需要来对其进行性能或大小上的扩展。”mysql|数据|数据库|语句|实行与PostgreSQL类似,可以使用很多分歧的言语来会见MySQL,包含C、C++、Java和Perl。从ProfessionalLinuxProgramming中第5章有关MySQL的以下章节中,NeilMatthew和RichardStones利用细致的MySQLC接口向我们先容了怎样在MySQL数据库中实行SQL语句。他们将会商前往数据的语句,比方INSERT和不前往数据的语句,比方UPDATE和DELETE。然后,他们将编写从数据库检索数据的复杂程序。

实行SQL语句

如今,我们已有了一个毗连,而且晓得怎样处置毛病,是时分会商利用我们的数据库来作一些实践事情了。实行一切范例的SQL的主关头字是mysql_query:

intmysql_query(MYSQL*connection,constchar*query)

正如您所见,它十分复杂。它取一个指向毗连布局的指针和包括要实行的SQL的文本字符串;与命令行工具分歧,将不利用停止分号。乐成以后,前往0。在必要包括二进制数据的特别情形下,可使用相干的函数,mysql_real_query。固然出于本章的目标,我们仅必要会商mysql_query。

不前往数据的SQL语句

我们将先会商UPDATE、DELETE和INSERT语句。由于它们不前往数据,以是更容易于利用。

这里我们将先容的另外一个主要函数是反省受影响的行数的函数:

my_ulonglongmysql_affected_rows(MYSQL*connection);

大概关于这一函数的最不言而喻的事就是其非同平常的前往了局。因为可移植性缘故原由,这是一个特别的无标记范例。为了在printf中利用,倡议将其强迫转换成利用%lu格局标准的无标记长整数。这个函数前往受之前的UPDATE、INSERT或DELETE查询影响的行数,这些查询是利用mysql_query实行的。

一般关于mysql_函数,前往码0暗示没有行受影响;负数暗示实践了局,一般是受影响的行数。

如前所述,当利用mysql_affected_rows时大概呈现未希冀的了局。让我们先会商受INSERT语句影响的行数,它将按预期举行操纵。将以下代码增加到程序connect2.c中,而且称其为insert1.c:

#include#include#include"mysql.h"intmain(intargc,char*argv[]){MYSQLmy_connection;intres;mysql_init(&my_connection);if(mysql_real_connect(&my_connection,"localhost","rick","bar","rick",0,NULL,0)){printf("Connectionsuccess
");res=mysql_query(&my_connection,"INSERTINTOchildren(fname,age),VALUES(Ann,3)");if(!res){printf("Inserted%lurows
",(unsignedlong)mysql_affected_rows(&my_connection));}else{fprintf(stderr,"Inserterror%d:s
",mysql_errno,(&my_connection),mysql_error(&my_connection));}mysql_close(&my_connection);}else{fprintf(stderr,"Connectionfailed
");if(mysql_errno(&my_connection)){fprintf(stderr,"Connectionerror%d:%s
",mysql_errno(&my_connection),mysql_error(&my_connection));}}returnEXIT_SUCCESS;}

正如预期,拔出的行数为1。

如今,我们变动代码,以是insert部分被交换成:

mysql_errno(&my_connection),mysql_error(&my_connection));}}res=mysql_query(&my_connection,"UPDATEchildrenSETAGE=4WHEREfname=Ann");if(!res){printf("Updated%lurows
",(unsignedlong)mysql_affected_rows(&my_connection));}else{fprintf(stderr,"Updateerror%d:%s
",mysql_errno(&my_connection),mysql_error(&my_connection));}

如今假定子表中有的数据,以下:

childnofnameage12
3
4
5
6
7
8
9
10
11
JennyAndrew
Gavin
Duncan
Emma
Alex
Adrian
Ann
Ann
Ann
Ann
1410
4
2
0
11
5
3
4
3
4


假如我们实行update1,但愿呈报的受影响行数为4,可是实践上程序呈报2,由于它仅必需变动2行,固然WHERE子句标识了4行。假如想让mysql_affected_rows呈报的了局为4这多是熟习别的数据库的人所希冀的),则必要记着将CLIENT_FOUND_ROWS标记传送到mysql_real_connect,在update2.c中的程序以下:

if(mysql_real_connect(&my_connection,"localhost","rick","bar","rick",0,NULL,CLIENT_FOUND_ROWS)){

假如我们在数据库中复位数据,然后运转带有这类修正的程序,则它呈报的行数为4。

函数mysql_affected_rows另有最初一个奇异的地方,它产生在从数据库中删除数据时。假如利用WHERE子句,则mysql_affected_rows将按预期前往删除行数。可是,假如没有WHERE子句,则删除一切行,呈报受影响的行数却为0。这是由于因为效力缘故原由优化删除全部表。这类举动不受CLIENT_FOUND_ROWS选项标记的影响。


下一页
任何规模的组织都可能受益于外包服务,并在一个标准化和优化的平台上统一其数据库管理任务。基于其本身的特性,DBaaS提供了敏捷和高效的数据库服务,它可以支持多变的需求。

海妖 发表于 2015-1-17 16:20:28

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);

只想知道 发表于 2015-1-20 20:11:03

我们学到了什么?思考问题的时候从表的角度来思考问

变相怪杰 发表于 2015-1-29 20:15:49

一个是把SQL语句写到客户端,可以使用DataSet进行加工;

愤怒的大鸟 发表于 2015-2-6 03:54:10

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

乐观 发表于 2015-2-15 11:38:32

只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。

蒙在股里 发表于 2015-3-4 11:29:54

但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。

活着的死人 发表于 2015-3-11 19:04:25

无法深入到数据库系统层面去了解和探究

飘飘悠悠 发表于 2015-3-19 08:53:25

我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!

谁可相欹 发表于 2015-3-27 16:09:33

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
页: [1]
查看完整版本: MYSQL网站制作之在MySQL数据库中利用C实行SQL语句