Linux下mysql简单编程
来源:互联网 发布:游资营业部席位软件 编辑:程序博客网 时间:2024/05/29 06:49
一、获取错误信息
(1)unsigned int mysql_errno(MYSQL *mysql)
描述
对于由mysql指定的连接,mysql_errno()返回最近调用的API函数的错误代码,该函数调用可能成功也可能失败。“0”返回值表示未出现错误。在MySQL errmsg.h头文件中,列出了客户端错误消息编号。在附录B:错误代码和消息中,也列出了这些错误。
注意,如果成功,某些函数,如mysql_fetch_row()等,不会设置mysql_errno()。
经验规则是,如果成功,所有向服务器请求信息的函数均会复位mysql_errno()。
返回值
如果失败,返回上次mysql_xxx()调用的错误代码。“0”表示未出现错误。
错误
无。
(2)const char *mysql_error(MYSQL *mysql)
描述
对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。
经验规则是,如果成功,所有向服务器请求信息的函数均会复位mysql_error()。
对于复位mysql_errno()的函数,下述两个测试是等效的:
if(mysql_errno(&mysql))
{
// an error occurred
}
if(mysql_error(&mysql)[0] != ‘\0’)
{
// an error occurred
}
通过重新编译MySQL客户端库,可以更改客户端错误消息的语言。目前,能够选择数种语言显示错误消息,请参见5.10.2节,“设置错误消息语言”。
返回值
返回描述错误的、由Null终结的字符串。如果未出现错误,返回空字符串。
错误
无。
二、连接服务器
(1)MYSQL *mysql_init(MYSQL *mysql)
描述
分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
返回值
初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
错误
(2)void mysql_close(MYSQL *mysql)
描述
关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。
返回值
无。
错误
无。
在内存不足的情况下,返回NULL。
(3)MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
描述
mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
参数
Mysql *mysql:
第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构
const char *host:
“host”的值必须是主机名或IP地址。如果“host”是NULL或字符串”localhost”,连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
const char *user:
“user”参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串”“,用户将被视为当前用户。在UNIX环境下,它是当前的登录名。
const char *passwd:
“passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
const char *db:
“db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
unsigned int port
如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
const char *unix_socket
如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
unsigned long client_flag
client_flag的值通常为0,但是,也能将其设置为下述标志的组合.
返回值
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
错误
返回消息列表错误
三、数据查询
1、int mysql_query(MYSQL *mysql, const char *query) //执行SQL语句
描述
执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。
mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。
返回值
如果查询成功,返回0。如果出现错误,返回非0值。
2、MYSQL_RES *mysql_store_result(MYSQL *mysql)
描述
(1)mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
(2)对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。
(3)如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
(4)如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
(5)如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
返回值
具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。
3、MYSQL_RES *mysql_use_result(MYSQL *mysql)
(1)mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。
(2)使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。C API给出命令不同步错误,如果忘记了执行该操作,将不能运行该命令。
4、void mysql_free_result(MYSQL_RES *result)
描述:释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
释放完成后,不要尝试访问结果集。
返回值 无。
错误 无。
5、MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) //返回列的字段
描述
对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。
返回值
关于结果集所有列的MYSQL_FIELD结构的数组。
错误
无。
6、unsigned int mysql_num_fields(MYSQL_RES *result)
要想传递MYSQL*参量取而代之,请使用无符号整数mysql_field_count(MYSQL *mysql)。
描述
返回结果集中的列数。
注意,你可以从指向结果集的指针或指向连接句柄的指针获得行数。如果mysql_store_result()或mysql_use_result()返回NULL,应使用连接句柄(因而没有结果集指针)。在该情况下,可调用mysql_field_count()来判断mysql_store_result()是否生成了非空结果。这样,客户端程序就能采取恰当的行动,而不需要知道查询是否是SELECT语句(或类似SELECT的语句)。在下面的示例中,介绍了执行该操作的方式。
返回值
表示结果集中行数的无符号整数。
错误
无。
7、unsigned int mysql_field_count(MYSQL *mysql)
描述
返回作用在连接上的最近查询的列数。
该函数的正常使用是在mysql_store_result()返回NULL(因而没有结果集指针)时。在这种情况下,可调用mysql_field_count()来判定mysql_store_result()是否应生成非空结果。这样,客户端就能采取恰当的动作,而无需知道查询是否是SELECT(或类似SELECT的)语句。在这里给出的示例中,演示了完成它的方法。
返回值
表示结果集中列数的无符号整数。
错误
无。
8、MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
描述
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。
可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
返回值
下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。
9、unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
描述
返回结果集内当前行的列的长度。
如果打算复制字段值,该长度信息有助于优化,这是因为,你能避免调用strlen()。此外,如果结果集包含二进制数据,必须使用该函数来确定数据的大小,原因在于,对于包含Null字符的任何字段,strlen()将返回错误的结果。
对于空列以及包含NULL值的列,其长度为0。要想了解区分这两类情况的方法,请参见关于mysql_fetch_row()的介绍。
返回值
无符号长整数的数组表示各列的大小(不包括任何终结NULL字符)。如果出现错误,返回NULL。
错误
mysql_fetch_lengths()仅对结果集的当前行有效。如果在调用mysql_fetch_row()之前或检索了结果集中的所有行后调用了它,将返回NULL。
三、Mysql的事务处理
事务处理是用来维护数据库的完整性的,它保证成批的MySQL操作要么完全执行,要么完成不执行。
1、开启事务 START TRANSACTION
2、静止自动提交 set autocommit=0
3、开启自动提交事务 set autocommit=1
4、提交事务 commit
5、事务回滚 rollback
#define BEGIN_TRAN "START TRANSACTION"#define SET_TRAN "SET AUTOCOMMIT=0" #define UNSET_TRAN "SET AUTOCOMMIT=1"#define COMMIT_TRAN "COMMIT"#define ROLLBACK_TRAN "ROLLBACK"int mysql_BeginTran(MYSQL *mysql){ int ret = 0; //--执行事务开始SQL ret = mysql_query(mysql, BEGIN_TRAN); if (ret != 0) { printf("func mysql_query() err: %d\n", ret); return ret; } //--设置事务手动提交 ret = mysql_query(mysql, SET_TRAN); if (ret != 0) { printf("func mysql_query() err: %d\n", ret); return ret; } return ret;}int mysql_Rollback(MYSQL *mysql){ int ret = 0; //--事务回滚操作 ret = mysql_query(mysql, ROLLBACK_TRAN); if (ret != 0) { printf("func mysql_query() err: %d\n", ret); return ret; } //--恢复事务自动提交标志 ret = mysql_query(mysql, UNSET_TRAN); if (ret != 0) { printf("func mysql_query() err: %d\n", ret); return ret; } return ret;}int mysql_Commit(MYSQL *mysql){ int ret = 0; //--执行事务提交SQL ret = mysql_query(mysql, COMMIT_TRAN); if (ret != 0) { printf("func mysql_query() err: %d\n", ret); return ret; } //--恢复自动提交设置 ret = mysql_query(mysql, UNSET_TRAN); if (ret != 0) { printf("func mysql_query() err: %d\n", ret); return ret; } return ret;}
#include <stdio.h>#include <mysql/mysql.h>MYSQL *Mysql_Init(){ //数据库句柄初始化 MYSQL *mysql = mysql_init(NULL); //分配或初始化与mysql_real_connect()相适应的MYSQL对象。 //如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。 if(mysql == NULL) { printf("mysql_init error: %s\n",mysql_error(mysql)); //对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。 return NULL; } //连接服务器 MYSQL *conn = mysql_real_connect(mysql,"localhost","root","123456","my_db",0,NULL,0); if(conn == NULL) { printf("mysql_real_connect error : %s\n",mysql_error(mysql)); return NULL; } printf("连接数据库my_db...\n"); //设置中文显示,解决中文乱码的问题 mysql_query(mysql,"set names utf8"); return mysql;}int mysql_exec(MYSQL *mysql,const char *sql) //sql 为MYSQL语句{ //查询数据库 int ret = mysql_query(mysql,sql); if(ret != 0) { printf("mysql_query error: %s\n",mysql_error(mysql)); return -1; } //从数据库把数据下载到本地 MYSQL_RES * mysql_res = mysql_store_result(mysql); //如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。 if(mysql_res == NULL) { //通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值, //或mysql_field_count()是否返回0,可以检查是否出现了错误。 if(mysql_errno(mysql) == 0) { printf("\nQuery Ok\n"); return 0; } else { printf("mysql_store_result : %s\n",mysql_error(mysql)); return -1; } } //返回列数 int i; unsigned char num_fields = mysql_num_fields(mysql_res); MYSQL_FIELD *fields = mysql_fetch_fields(mysql_res); for(i = 0; i < num_fields; i++) { printf("%-8s",fields[i].name); } printf("\n"); //显示数据库的内容 MYSQL_ROW row; //数组 while(row = mysql_fetch_row(mysql_res)) { for(i = 0; i < num_fields; i++) { printf("%-8s",row[i]); } printf("\n"); }}int main(){ MYSQL *mysql = Mysql_Init(); if(mysql == NULL) { printf("mysql_init error : %s\n",mysql_error(mysql)); return -1; } mysql_exec(mysql,"select * from students"); return 0;}
- Linux下mysql简单编程
- Linux 下串口简单编程
- Linux 下串口简单编程
- linux下简单网络编程
- linux下MYSQL简单操作
- Linux下Mysql简单操作
- Linux下mysql简单配置
- Linux下shell的简单编程
- Linux下shell的简单编程
- Linux下简单的socket编程
- linux下tcp编程简单示例
- linux下udp编程简单示例
- Linux下的简单socket编程示例
- Linux下Socket编程简单例子
- Linux下多线程编程简单示例
- linux下串口编程简单实例
- linux下简单的socket编程
- Linux下多线程编程简单示例
- Hadoop基础教程-第5章 YARN:资源调度平台(5.6 YARN的命令)(草稿)
- 查找算法总结(3)--二叉查找树
- 野指针:释放内存但却仍然使用它,将导致野指针
- SSM框架(一)---宏观了解
- 图片占用内存的计算
- Linux下mysql简单编程
- (bower、grunt、gulp、jspm、karmam、webpack) 前端工程自动化开发工具
- 文件上传
- css里的relative和absolute区分
- 关于分页的小问题
- TIME_WAIT状态存在的理由
- laravel笔记(laravist 笔摘)
- 【bzoj1005】[HNOI2008]明明的烦恼
- Java面试题收集(转自知乎)