Openwrt下C调用mysql API
2016-06-16 17:19
531 查看
之前有介绍openwrt下如何安装mysql,现在我们来说下C怎么操作mysql
应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。
使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。
代码示例:
如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
可以结合这两个示例来看,我放的并不是很全,自己体会吧!!!!
一、几个mysql API
1. mysql_init
函数原型: MYSQL *mysql_init(MYSQL * mysql); 参数说明: mysql:为NULL,则分配一个(返回其指针)。或按照传入的结构指针进行初始化。 MYSQL:返回值,若为NULL表示出错。
2. mysql_options
可用于设置额外的连接选项,并影响连接的行为。一次设置一个,可多次调用该函数来设置数个选项。应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
函数原型: int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg); 参数说明: int:返回值,该函数成功时返回0。如果使用了未知选项,返回非0值。
3. mysql_real_connect
与数据库建立连接函数原型: 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) 参数说明: host:该值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。 user:参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。 passwd:参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。 db:是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。 port:若不是0,其值将用作TCP/IP连接的端口号。 unix_socket:若不是NULL,该字符串描述了应使用的套接字或命名管道。 client_flag:的值通常为0。 MYSQL:如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
4. mysql_close
关闭连接函数原型: void mysql_close(MYSQL *connection);
5. mysql_error
函数原型: const char *mysql_error(MYSQL *mysql)
6. mysql_errno
函数原型: unsigned int mysql_errno(MYSQL *mysql) 参数说明: int:对于由mysql指定的连接,mysql_errno()返回最近调用的API函数的错误代码,该函数调用可能成功也可能失败。“0”返回值表示未出现错误。
7. mysql_query
执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。函数原型: int mysql_query(MYSQL *mysql, const char *query) 参数说明: int:如果查询成功,返回0。如果出现错误,返回非0值。
8. mysql_affected_rows
返回上次UPDATE更改的行数,上次DELETE删除的行数,或上次INSERT语句插入的行数。对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,mysql_affected_rows()的工作方式与mysql_num_rows()类似。函数原型: my_ulonglong mysql_affected_rows(MYSQL *mysql) 参数说明: my_ulonglong:大于0的整数表明受影响或检索的行数。“0”表示UPDATE语句未更新记录,在查询中没有与WHERE匹配的行,或未执行查询。“-1”表示查询返回错误
9. mysql_use_result
对于成功检索数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN),必须调用mysql_store_result()或mysql_use_result()。mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。
使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。
函数原型: MYSQL_RES *mysql_use_result(MYSQL *mysql)
代码示例:
MYSQL_RES * res_ptr = mysql_use_result(&my_connection); MYSQL_ROW sqlrow; if (res_ptr) { while ((sqlrow = mysql_fetch_row(res_ptr))) { printf("We inserted childno %s\n", sqlrow[0]); } mysql_free_result(res_ptr);
10. mysql_store_result
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
函数原型: MYSQL_RES *mysql_store_result(MYSQL *mysql)
11. mysql_fetch_row
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。函数原型: MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
12. mysql_free_result
函数原型: MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
二、代码示例
void create_mysql(const char *time,const char * my_test) { MYSQL *my_con; int row; int res; char reconnect=1; char query[256]; char *fmt="INSERT INTO test.information SET " "time=NOW()" " my_test='%s'" ;//由于在query的时候不能直接调用变量,这里我们用snprintf来赋值 snprintf(query,sizeof(query),fmt,my_test); //初始化数据库 if(!(my_con=mysql_init(NULL))) { debug(LOG_INFO,"init mysql error??????????"); return; } //连接数据库 mysql_options(my_con,MYSQL_OPT_RECONNECT,(char *)&reconnect); if(mysql_real_connect(my_con,"127.0.0.1","root","test","test",0,NULL,0)!=NULL) { if(mysql_set_character_set(my_con, "utf8")) { debug(LOG_INFO,"set utf-8 error????"); goto error; } //执行mysql语句,在test库中建立information表 row=mysql_query(my_con,"create table information(time char(20) primary key,my_test char(20))");//建立两个成员,并设置time为主键 if(row!=0) { debug(LOG_INFO,"information table create error!!!!"); }else debug(LOG_INFO,"create information success!!!"); //在表中插入数据 res=mysql_query(my_con,query); if(res!=0) { debug(LOG_INFO,"insert error!!!"); goto error; }else debug(LOG_INFO,"insert success!!!!"); }else { debug(LOG_INFO,"connect test db error???????"); goto error; } error: mysql_close(my_con); memset(query,0,sizeof(query)); }
static int count(void) { MYSQL *dbh; MYSQL_RES *res; MYSQL_ROW row; int n; char query[128]; char *fmt = "SELECT count(*) FROM %s.%s"; snprintf(query, sizeof(query), fmt, "test", "information"); if(mysql_query(dbh, query)) { syslog(LOG_ERR, "mysql query failed.(%s)\n", mysql_error(dbh)); return -1; } if(!(res = mysql_store_result(dbh))) { syslog(LOG_ERR, "mysql store failed.(%s)\n", mysql_error(dbh)); return -1; } if(!(row = mysql_fetch_row(res))) { syslog(LOG_ERR, "mysql fetch failed.(%s)\n", mysql_error(dbh)); mysql_free_result(res); return -1; } n = atoi(row[0]); mysql_free_result(res); return n;
可以结合这两个示例来看,我放的并不是很全,自己体会吧!!!!
相关文章推荐
- 使用OpenDataSource从Excel导入数据到SQL时报错
- PL/SQL Developer执行.sql文件的几种方法
- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly
- win7_oracle11g_64位连接32位PLSQL_Developer
- 【Oracle】PLSQL Developer如何连接Oracle
- Informix 11.5 SQL 语句性能监控方法及实现
- SQL Server 维护计划实现数据库备份(策略实战)
- SQL Server 维护计划实现数据库备份(Step by Step)
- MSSQL中全局变量@@identity与方法scope_identity()的区别
- SQL Server内存架构基础
- SQL Server内存架构基础
- 本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
- 本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
- MySQL 性能监控4大指标——第二部分
- MySQL 性能监控4大指标——第二部分
- MySQL性能调优与架构设计——第13章 可扩展性设计之 MySQL Replication
- PL/SQL Developer连接本地Oracle 11g 64位数据库
- go mysql dsn
- flume+kafka+storm+mysql架构设计
- 登陆pl/sql developer