mysql基本API介绍mysql_init,mysql_real_connect,mysql_query,mysql_close等

https://blog.csdn.net/linux_ever/article/details/50651513

一: 分配或初始化与mysql_real_connect()相适应的MYSQL对象。用mysql_init()函数。

MYSQL *mysql_init(MYSQL *mysql) 

描述

分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。

返回值

初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL

错误

在内存不足的情况下,返回NULL


二:连接数据库引擎,通过函数mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。


 
 
  1. 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()必须成功完成。

参数的指定方式如下:

· 第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构。通过mysql_options()调用,可更改多种连接选项。请参见25.2.3.48节,“mysql_options()”。

· “host”的值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。

· “user”参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。在Windows ODBC下,必须明确指定当前用户名。请参见26.1.9.2节,“在Windows上配置MyODBC DSN”。

· “passwd”参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。

注释:调用mysql_real_connect()之前,不要尝试加密密码,密码加密将由客户端API自动处理。

· “db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。

· 如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。

· 如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。

· client_flag的值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:

标志名称

标志描述

CLIENT_COMPRESS

使用压缩协议。

CLIENT_FOUND_ROWS

返回发现的行数(匹配的),而不是受影响的行数。

CLIENT_IGNORE_SPACE

允许在函数名后使用空格。使所有的函数名成为保留字。

CLIENT_INTERACTIVE

关闭连接之前,允许interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话wait_timeout变量被设为会话interactive_timeout变量的值。

CLIENT_LOCAL_FILES

允许LOAD DATA LOCAL处理功能。

CLIENT_MULTI_STATEMENTS

通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。

CLIENT_MULTI_RESULTS

通知服务器,客户端能够处理来自多语句执行或存储程序的多个结果集。如果设置了CLIENT_MULTI_STATEMENTS,将自动设置它。

CLIENT_NO_SCHEMA

禁止db_name.tbl_name.col_name语法。它用于ODBC。如果使用了该语法,它会使分析程序生成错误,在捕获某些ODBC程序中的缺陷时,它很有用。

CLIENT_ODBC

客户端是ODBC客户端。它将mysqld变得更为ODBC友好。

CLIENT_SSL

使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的。


返回值
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。

三:查询数据库中的某一个表内容,通过函数mysql_query()来实现。

本例调用为:mysql_query(connect, "select * from dept);

int mysql_query(MYSQL *mysql, const char *query) 

描述

执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“<span class=“hljs-selector-tag”>g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。请参见25.2.9节,“多查询执行的C API处理”。

mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。

如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。请参见25.2.3.22节,“mysql_field_count()”。

返回值

如果查询成功,返回0。如果出现错误,返回非0值。

查询的结果需要mysql_store_result来获取。查询的结果通过结构体mysql关联。


四:显示查询数据库中数据表的内容,mysql_store_result()将mysql_query()查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。

此时应该注意,查询的结果有可能是多行。

应该调用函数mysql_field_count()返回表的列数。

可以调用函数mysql_fetch_row()来获取多行结果的一行内容。

可以通过函数mysql_fetch_fields()来获取表头的内容。

MYSQL_RES *mysql_store_result(MYSQL *mysql) 

描述

对于成功检索了数据的每个查询(SELECTSHOWDESCRIBEEXPLAINCHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。

对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。

如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。请参见25.2.3.22节,“mysql_field_count()”。

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()。

请参见25.2.13.1节,“为什么在mysql_query()返回成功后,mysql_store_result()有时会返回NULL”.

返回值

具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL

mysql_field_count()简介:

unsigned int mysql_field_count(MYSQL *mysql) 

描述

返回作用在连接上的最近查询的列数。

该函数的正常使用是在mysql_store_result()返回NULL(因而没有结果集指针)时。在这种情况下,可调用mysql_field_count()来判定mysql_store_result()是否应生成非空结果。这样,客户端就能采取恰当的动作,而无需知道查询是否是SELECT(或类似SELECT的)语句。在这里给出的示例中,演示了完成它的方法。

请参见25.2.13.1节,“为什么在mysql_query()返回成功后,mysql_store_result()有时会返回NULL”.

返回值

表示结果集中列数的无符号整数。

错误

无。

mysql_fetch_row()简介:

MYSQL_ROW 是char ** 类型;
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

错误

注意,在对mysql_fetch_row()的两次调用之间,不会复位错误。

· CR_SERVER_LOST

在查询过程中,与服务器的连接丢失。

· CR_UNKNOWN_ERROR

出现未知错误。

mysql_fetch_fields()简介:

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 

描述

对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。

返回值

关于结果集所有列的MYSQL_FIELD结构的数组。

错误

无。

示例:

unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;

num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
printf(“Field %u is %s\n”, i, fields[i].name);
}


五:释放内存,释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。

void mysql_free_result(MYSQL_RES *result) 

描述

释放由mysql_store_result()mysql_use_result()mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。

释放完成后,不要尝试访问结果集。

返回值

无。

错误

无。

六:关闭前面打开的mysql连接。

void mysql_close(MYSQL *mysql) 

描述

关闭前面打开的连接。如果句柄是由mysql_init()mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。

返回值

无。

错误

无。


通过mysql客户端来查询数据库test中表department的内容:

 select * from department;


通过C语言程序调用Mysql的API函数来查询数据库test中表department的内容:

源代码:


 
 
  1. /*************************************************************************
  2. > File Name:mysql_test.c
  3. > Author:
  4. > Mail:
  5. > Created Time: 2016年02月11日 星期四 10时45分31秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <mysql/mysql.h>
  11. int main()
  12. {
  13. int ret = 0;
  14. MYSQL mysql;
  15. MYSQL * connect = NULL;
  16. connect = mysql_init(&mysql);
  17. if(connect == NULL){
  18. ret = mysql_errno(&mysql);
  19. printf( "mysql_init error, %s\n", mysql_error(&mysql));
  20. return ret;
  21. }
  22. printf( "mysql_init ok...\n");
  23. //connect = mysql_real_connect(connect, NULL, "root", "yxk", "mydb61", 0, NULL, 0);
  24. connect = mysql_real_connect(connect, "localhost", "root", "yxk", "test", 0, NULL, 0);
  25. if(connect == NULL){
  26. ret = mysql_errno(&mysql);
  27. printf( "mysql_real_connect error, err is: %s\n", mysql_error(&mysql));
  28. return ret;
  29. }
  30. printf( "mysql_real_connect ok...\n");
  31. const char * query = "select * from department";
  32. ret = mysql_query(connect, query);
  33. if(ret != 0){
  34. printf( "mysql_query error\n");
  35. return ret;
  36. }
  37. MYSQL_RES *result = mysql_store_result(&mysql);
  38. if(result == NULL){
  39. printf( "mysql_store_result error\n");
  40. return -1;
  41. }
  42. int field_num = mysql_field_count(&mysql);
  43. //表头
  44. MYSQL_FIELD * fields = mysql_fetch_fields(result);
  45. int i = 0;
  46. printf( "------------------------------------------\n");
  47. for(i= 0; i < field_num; i++){
  48. printf( "%s \t", fields[i].name);
  49. }
  50. printf( "\n------------------------------------------\n");
  51. //表内容
  52. MYSQL_ROW row = NULL;
  53. while(row = mysql_fetch_row(result)){
  54. for(i= 0; i < field_num; i++){
  55. printf( "%s \t", row[i]);
  56. }
  57. printf( "\n");
  58. }
  59. mysql_free_result(result); //释放内存
  60. mysql_close(connect);
  61. printf( "mysql_close...\n");
  62. return ret;
  63. }

Makefile文件:

mysql_test:mysql_test.c
	gcc mysql_test.c -o mysql_test -I/usr/include/ -L/usr/lib/x86_64-linux-gnu/ -lmysqlclient
clean:
	rm mysql_test 

运行输出结果:


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值