首页 > 数据库 > MySQL > 正文

用C语言操作MySQL数据库的通用方法

2024-07-24 13:07:44
字体:
来源:转载
供稿:网友

在为MySQL提供接口方面,C语言具有更好的安全性和性能,本篇文章介绍了C语言操作MySQL数据库的通用方法,需要了解的朋友可以参考下

在我们的web应用中,虽然PHP、JSP等脚本均提供了MySQL的接口,但是显然直接使用C语言具有更好的安全性和性能,在这篇文章中能够有所体现。

先看结构体:

以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接.

 

 
  1. typedef struct st_mysql {  
  2. NET net; /* Communication parameters */  
  3. gptr connector_fd; /* ConnectorFd for SSL */  
  4. char *host,*user,*passwd,*unix_socket,  
  5. *server_version,*host_info,*info,*db;  
  6. unsigned int port,client_flag,server_capabilities;  
  7. unsigned int protocol_version;  
  8. unsigned int field_count;  
  9. unsigned int server_status;  
  10. unsigned long thread_id; /* Id for connection in server */  
  11. my_ulonglong affected_rows;  
  12. my_ulonglong insert_id; /* id if insert on table with NEXTNR */  
  13. my_ulonglong extra_info; /* Used by mysqlshow */  
  14. unsigned long packet_length;  
  15. enum mysql_status status;  
  16. MYSQL_FIELD *fields;  
  17. MEM_ROOT field_alloc;  
  18. my_bool free_me; /* If free in mysql_close */  
  19. my_bool reconnect; /* set to 1 if automatic reconnect */  
  20. struct st_mysql_options options;  
  21. char scramble_buff[9];  
  22. struct charset_info_st *charset;  
  23. unsigned int server_language;  
  24. } MYSQL; 

这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的朋友应该对数据库中查询后得到的结果集不会陌生,在C的API里对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。

 

 
  1. typedef struct st_mysql_res {  
  2. my_ulonglong row_count;  
  3. unsigned int field_count, current_field;  
  4. MYSQL_FIELD *fields;  
  5. MYSQL_DATA *data;  
  6. MYSQL_ROWS *data_cursor;  
  7. MEM_ROOT field_alloc;  
  8. MYSQL_ROW row; /* If unbuffered read */  
  9. MYSQL_ROW current_row; /* buffer to current row */  
  10. unsigned long lengths; / column lengths of current row */  
  11. MYSQL handle; / for unbuffered reads */  
  12. my_bool eof; /* Used my mysql_fetch_row */  
  13. } MYSQL_RES; 

--------------------------------

再看函数:

C语言操作mysql数据 常用函数

 

 
  1. 所需头文件: #include <mysql/mysql.h> 
  2. 功能: 获得或初始化一个MYSQL结构 
  3. 函数原型: MYSQL *mysql_init(MYSQL *mysql) 
  4. 函数返回值: 一个被始化的MYSQL*句柄 
  5. 备注: 在内存不足的情况下,返回NULL 
  6.  
  7. 所需头文件: #include <mysql/mysql.h> 
  8. 函数功能: 关闭一个服务器连接,并释放与连接相关的内存 
  9. 函数原型: void mysql_close(MYSQL *mysql); 
  10. 函数传入值: MYSQL:类型的指针 
  11. 函数返回值: 无 
  12.  
  13. 所需头文件: #include <mysql/mysql.h> 
  14. 函数功能: 连接一个MySQL服务器 
  15. 函数原型: MYSQL * mysql_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd); 
  16. 函数传入值: mysql表示一个现存mysql结构的地址 
  17. host表示MYSQL服务器的主机名或IP 
  18. user表示登录的用户名 
  19. passwd表示登录的密码 
  20. 函数返回值: 如果连接成功,一个MYSQL *连接句柄:如果连接失败,NULL 
  21. 备注: 该函数不推荐,使用mysql_real_connect()代替 
  22.  
  23. 所需文件: #include <mysql/mysql.h> 
  24. 函数功能: 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 int client_flag); 
  25. 函数传入值: mysql表示一个现存mysql结构的地址 
  26. host表示MYSQL服务器的主机名或IP 
  27. user表示登录的用户名 
  28. passwd表示登录的密码 
  29. db表示要连接的数据库 
  30. port表示MySQL服务器的TCP/IP端口 
  31. unix_socket表示连接类型 
  32. client_flag表示MySQL运行ODBC数据库的标记 
  33. 函数返回值: 如果连接成功,一个MYSQL*连接句柄:如果连接失败,NULL 
  34.  
  35. 所需头文件: #include <mysql/mysql.h> 
  36. 函数功能: 返回最新的UPDATE,DELETE或INSERT查询影响的行数 
  37. 函数传入值: MYSQL:类型指针 
  38. 函数返回值: 大于零的一个整数表示受到影响或检索出来的行数。零表示没有区配查序中WHERE子句的记录或目前还没有查询被执行;-1表示查询返回一个错误,或对于一个SELECT查询 
  39.  
  40. 所需头文件: #include <mysql/mysql.h> 
  41. 函数功能: 对指定的连接执行查询 
  42. 函数原型: int mysql_query(MYSQL *mysql,const char *query); 
  43. 函数传入值: query表示执行的SQL语句 
  44. 函数返回值: 如果查询成功,为零,出错为非零。 
  45. 相关函数: mysql_real_query 
  46.  
  47. 所需头文件: #include <mysql/mysql.h> 
  48. 函数功能: 为无缓冲的结果集获得结果标识符 
  49. 函数原形: MYSQL_RES *mysql_use_result(MYSQL *mysql); 
  50. 函数传入值: MYSQL:类型的指针 
  51. 函数返回值: 一个MYSQL_RES结果结构,如果发生一个错误发NULL 
  52.  
  53. #incluee <mysql/mysql.h> 
  54. 检索一个结果集合的下一行 
  55. MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); 
  56. MYSQL_RES:结构的指针 
  57. 下一行的一个MYSQL_ROW结构。如果没有更多的行可检索或如果出现一个错误,NULL 
  58.  
  59. #include <mysql/mysql.h> 
  60. 返回指定结果集中列的数量 
  61. unsigned int mysql_num_fields(MYSQL_RES *res); 
  62. MYSQL_RES 结构的指针 
  63. 结果集合中字段数量的一个无符号整数 
  64.  
  65. #include <mysql/mysql.h> 
  66. 创建一个数据库 
  67. int mysql_create_db(MYSQL *mysql,const char *db); 
  68. MYSQL:类型的指针 
  69. db:要创建的数据库名 
  70. 如果数据库成功地被创建,返回零,如果发生错误,为非零。 
  71.  
  72. #include <mysql/mysql.h> 
  73. 选择一个数据库 
  74. int mysql_select_db(MYSQL *mysql,const char *db); 
  75. MYSQL:类型的指针 
  76. db:要创建的数据库名 
  77. 如果数据库成功地被创建,返回零,如果发生错误,为非零。 

----------------------------------------------

--------------

再看例子:

很多人用到MySQL来开发一些项目,有时为了性能,我们会直接用C语言来开发相关的模块,尤其在我们的web应用中,虽然PHP、JSP等脚本均提供了MySQL的接口,但是显然直接使用C语言具有更好的安全性和性能,Michael以前用PHP开发的多个项目中就使用了C语言编写的这类接口,然后再编译到php里面,供php脚本直接使用,这方面的话题就不多说了,下面主要说一下在Linux下如何用C语言连接MySQL数据库,并且读取里面的 数据返回,同时如何进行编译。

这里的大部分代码参考了MySQL发行包里面的.c源文件,大家也可以去里面找找相关的代码,下面这段代码实现了连接到本地MySQL服务器上9tmd_bbs_utf8数据库,从数据表tbb_user中根据输入的userid取得该用户的用户名并打印输出到终端。

 

 
  1. #if defined(_WIN32) || defined(_WIN64) //为了支持windows平台上的编译 
  2. #include <windows.h> 
  3. #endif 
  4. #include <stdio.h> 
  5. #include <stdlib.h> 
  6. #include "mysql.h" //我的机器上该文件在/usr/local/include/mysql下 
  7.  
  8. //定义数据库操作的宏,也可以不定义留着后面直接写进代码 
  9. #define SELECT_QUERY "select username from tbb_user where userid = %d" 
  10.  
  11. int main(int argc, char **argv) //char **argv 相当于 char *argv[] 
  12. MYSQL mysql,*sock; //定义数据库连接的句柄,它被用于几乎所有的MySQL函数 
  13. MYSQL_RES *res; //查询结果集,结构类型 
  14. MYSQL_FIELD *fd ; //包含字段信息的结构 
  15. MYSQL_ROW row ; //存放一行查询结果的字符串数组 
  16. char qbuf[160]; //存放查询sql语句字符串 
  17.  
  18. if (argc != 2) { //检查输入参数 
  19. fprintf(stderr,"usage : mysql_select <userid>/n/n"); 
  20. exit(1); 
  21.  
  22. mysql_init(&mysql); 
  23. if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) { 
  24. fprintf(stderr,"Couldn't connect to engine!/n%s/n/n",mysql_error(&mysql)); 
  25. perror(""); 
  26. exit(1); 
  27.  
  28. sprintf(qbuf,SELECT_QUERY,atoi(argv[1])); 
  29. if(mysql_query(sock,qbuf)) { 
  30. fprintf(stderr,"Query failed (%s)/n",mysql_error(sock)); 
  31. exit(1); 
  32.  
  33. if (!(res=mysql_store_result(sock))) { 
  34. fprintf(stderr,"Couldn't get result from %s/n", mysql_error(sock)); 
  35. exit(1); 
  36.  
  37. printf("number of fields returned: %d/n",mysql_num_fields(res)); 
  38.  
  39. while (row = mysql_fetch_row(res)) { 
  40. printf("Ther userid #%d 's username is: %s/n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0])) ;  
  41. puts( "query ok !/n" ) ;  
  42. }  
  43.  
  44. mysql_free_result(res); 
  45. mysql_close(sock); 
  46. exit(0); 
  47. return 0; //. 为了兼容大部分的编译器加入此行 

编译的时候,使用下面的命令

gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 后面两个选项可选,根据您的环境情况

运行的时候,执行下面的命令

./mysql_select 1

将返回如下结果:

number of fields returned: 1

Ther userid #1 ‘s username is: Michael

query ok !

以上就是本文的全部内容,希望对大家的学习有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表