使用MySQL提供的C接口访问mysql数据库
2017-03-28 18:26
471 查看
以前使用过mysql提供的C接口访问mysql数据库,没有出现过问题。就“别出心裁”想写出更漂亮的代码,如下:
1、定义了一个代表mysql连接的指针,初始化为NULL;妄想通过mysql_init(p_conn)来申请一个MYSQL的内存空间,并让p_conn指向这个地址;根据p_conn是否为NULL判断该数据库连接是否断开,不为NULL就断开连接,并赋给p_conn NULL值。
2、连接数据库和执行sql语句都没有问题。
3、妄想通过mysql_fetch_row(p_result)不仅从服务器取得一行数据,而且分配一个存储结果集的内存空间,p_result也会从NULL变成非NULL;
再看看正确的代码:
1、mysql_init()不会在内存中申请一个MYSQL结构,所以直接在栈里面定义一个,后续用&conn。
3、关于MYSQL_RES *p_result结果集指针,需要使用mysql_use_result()产生一个结果集(返回值是结果集指针),用完之后要用mysql_free_result()释放掉这块内存。
下面是一段关于这个问题mysql官网给出的解释:
After invoking mysql_query() you
must call mysql_use_result() for every statement that successfully produces a result set.
You must also call mysql_free_result() after you are done with the result set.
下面是mysql官网对C语言的API的在线手册地址,喜欢的同学多看看。
https://dev.mysql.com/doc/refman/5.7/en/c-api.html
static MYSQL *p_conn=NULL; static MYSQL_RES *p_result=NULL; int main (int argc, char *argv[]) { mysql_init(p_conn); if( NULL==mysql_real_connect(p_conn, "localhost", "root", "*****", "*****", 0, NULL, 0) ) { printf("error %u: %s\n", mysql_errno(p_conn), mysql_error(p_conn)); } if( mysql_query(p_conn, "select * from online_dev") ) { printf("error %u: %s\n", mysql_errno(p_conn), mysql_error(p_conn)); } while( NULL!=(row=mysql_fetch_row(p_result)) ) { /******** ********/ } if( NULL!=p_result ) { mysql_free_result(p_result); p_result=NULL; } if( NULL!=p_conn ) { mysql_close(p_conn); p_conn=NULL; } return 0; }实际运行的时候会收到SIGSEGV信号,提示段错误。分析这段代码:
1、定义了一个代表mysql连接的指针,初始化为NULL;妄想通过mysql_init(p_conn)来申请一个MYSQL的内存空间,并让p_conn指向这个地址;根据p_conn是否为NULL判断该数据库连接是否断开,不为NULL就断开连接,并赋给p_conn NULL值。
2、连接数据库和执行sql语句都没有问题。
3、妄想通过mysql_fetch_row(p_result)不仅从服务器取得一行数据,而且分配一个存储结果集的内存空间,p_result也会从NULL变成非NULL;
再看看正确的代码:
static MYSQL conn; static MYSQL_RES *p_result; int main (int argc, char *argv[]) { mysql_init(&conn); if( NULL==mysql_real_connect(&conn, "localhost", "root", "*****", "*****", 0, NULL, 0) ) { printf("error %u: %s\n", mysql_errno(&conn), mysql_error(&conn)); } if( mysql_query(&conn, "select * from online_dev") ) { printf("error %u: %s\n", mysql_errno(&conn), mysql_error(&conn)); } p_result=mysql_use_result(&conn); while( NULL!=(row=mysql_fetch_row(p_result)) ) { /******** ********/ } mysql_free_result(p_result); mysql_close(&conn); return 0; }说明:
1、mysql_init()不会在内存中申请一个MYSQL结构,所以直接在栈里面定义一个,后续用&conn。
3、关于MYSQL_RES *p_result结果集指针,需要使用mysql_use_result()产生一个结果集(返回值是结果集指针),用完之后要用mysql_free_result()释放掉这块内存。
下面是一段关于这个问题mysql官网给出的解释:
After invoking mysql_query() you
must call mysql_use_result() for every statement that successfully produces a result set.
You must also call mysql_free_result() after you are done with the result set.
下面是mysql官网对C语言的API的在线手册地址,喜欢的同学多看看。
https://dev.mysql.com/doc/refman/5.7/en/c-api.html
相关文章推荐
- 如何使用mysql的C接口访问mysql数据库
- 通过MySQL提供的C API访问MySQL数据库
- Mysql: 基于MySQL API 接口,Viual Studio,访问 Mysql数据库
- Mysql数据库学习(四):常用Mysql C API 介绍和使用、封装一个访问Mysql数据库的类MysqlDB
- 如何使用ODBC接口访问MySQL
- 使用hiredis提供的接口访问redis中的ZSeT对象
- 通过MySQL C API界面(mysql自己提供的API方式访问mysql数据库)
- OpenResty的安装和在nginx中使用lua直接访问mysql达到数据接口的统一
- 在nginx中使用lua直接访问mysql和memcaced达到数据接口的统一
- Base提供了Java Api的访问接口,掌握这个就跟Java应用使用RDBMS时需要JDBC一样重要[
- 在nginx中使用lua直接访问mysql和memcaced达到数据接口的统一
- C++使用mysql 库访问MYSQL数据库,mysql_init函数破坏内存的问题
- 最近使用Navicat for MySQl访问远程mysql数据库,出现报错,显示“1130 - Host'xxx.xxx.xxx.xxx' is not allowed to connect to
- VC使用mysql.h的接口头文件进行连接mysql数据库开发的完整解决方案
- 使用springboot构建restful形式的接口并提供实时访问
- 您未被授权查看该页 您不具备使用所提供的凭据查看该目录或页的权限 HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝。
- asp采用ODBC接口访问MySQL的方法
- 使用vbXMLRPC组件访问xmlrpc接口
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务