仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1052|回复: 9
打印 上一主题 下一主题

[学习教程] MYSQL网站制作之在MySQL数据库中利用C实行SQL语句

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:45:29 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

实行SQL语句

如今,我们已有了一个毗连,而且晓得怎样处置毛病,是时分会商利用我们的数据库来作一些实践事情了。实行一切范例的SQL的主关头字是mysql_query:
  1. intmysql_query(MYSQL*connection,constchar*query)
复制代码

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

不前往数据的SQL语句

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

这里我们将先容的另外一个主要函数是反省受影响的行数的函数:
  1. my_ulonglongmysql_affected_rows(MYSQL*connection);
复制代码

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

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

如前所述,当利用mysql_affected_rows时大概呈现未希冀的了局。让我们先会商受INSERT语句影响的行数,它将按预期举行操纵。将以下代码增加到程序connect2.c中,而且称其为insert1.c:
  1. #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
  2. ");res=mysql_query(&my_connection,"INSERTINTOchildren(fname,age),VALUES(Ann,3)");if(!res){printf("Inserted%lurows
  3. ",(unsignedlong)mysql_affected_rows(&my_connection));}else{fprintf(stderr,"Inserterror%d:s
  4. ",mysql_errno,(&my_connection),mysql_error(&my_connection));}mysql_close(&my_connection);}else{fprintf(stderr,"Connectionfailed
  5. ");if(mysql_errno(&my_connection)){fprintf(stderr,"Connectionerror%d:%s
  6. ",mysql_errno(&my_connection),mysql_error(&my_connection));}}returnEXIT_SUCCESS;}
复制代码

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

如今,我们变动代码,以是insert部分被交换成:
  1. mysql_errno(&my_connection),mysql_error(&my_connection));}}res=mysql_query(&my_connection,"UPDATEchildrenSETAGE=4WHEREfname=Ann");if(!res){printf("Updated%lurows
  2. ",(unsignedlong)mysql_affected_rows(&my_connection));}else{fprintf(stderr,"Updateerror%d:%s
  3. ",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中的程序以下:
  1. 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选项标记的影响。


[1][2]下一页

任何规模的组织都可能受益于外包服务,并在一个标准化和优化的平台上统一其数据库管理任务。基于其本身的特性,DBaaS提供了敏捷和高效的数据库服务,它可以支持多变的需求。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-22 05:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表