linux下c mysql编程函数总结2

来源:互联网 发布:股票编程怎么输入 编辑:程序博客网 时间:2024/05/08 17:54

说是C++下的MySQL编程,其实用的还是MySQL自带的C API,因为在我学习的一份游戏的C++源代码中,就是直接使用的C API,还有一份是基于C++封装的MySQ++ API包,这个我还不了解,以后有时间研究一下。


在对MySQL的操作中,主要需要熟悉几个API,这里我总结了一下我遇到的常用的API以及对应的数据结构,最后举一个例子表明这些API的使用。


常用MySQL API

[cpp] view plain copy
  1. MYSQL* mysql_init(MYSQL* mysql)//连接句柄,必须初始化之后才能使用  
  2.   
  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) //连接数据库,  
  4.   
  5. int mysql_query(MYSQL* mysql, const char* query) //查询函数,成功返回零,否则返回错误类型非零值。  
  6.   
  7. const char* mysql_error(MYSQL* mysql) //返回最近一次调用失败的错误消息(返回的是字符串消息)  
  8.   
  9. unsigned int mysql_errno(MYSQL* mysql) //返回最近一次调用失败的错误代号(返回的是数字代号)  
  10.   
  11. MySQL_RES* mysql_store_result(MYSQL* mysql) //将数据库中查询(mysql_query)得到的结果(集合)存放在MySQL_RES结构中  
  12.   
  13. unsigned int mysql_num_fields(MYSQL_RES* res) //返回结果集中的列的数目  
  14.   
  15. MYSQL_ROW* mysql_fetch_row(MYSQL_RES* res) //返回结果集(MYSQL_RES)的当前行的结果  
  16.   
  17. unsigned int mysql_num_rows(MYSQL_RES* res) //返回结果集中的行的数目  
  18.   
  19. unsigned long* mysql_fetch_lengths(MYSQL_RES* res) //返回结果集中各列的长度(可用于字符串拷贝,代替strlen函数)  
  20.   
  21. void mysql_close(MYSQL* mysql) //数据库使用完毕之后应该进行关闭  




相关数据结构

MYSQL: 代表一个数据库连接的句柄

[cpp] view plain copy
  1. <strong><span style="font-size:14px;">MYSQL_RES</span></strong>:代表查询结果集,数据结构如下  
  2. typedef struct st_mysql_res {  
  3.   my_ulonglong row_count;                               // 结果集的行数  
  4.   unsigned int field_count, current_field;            // 结果集的列数,当前列  
  5.   MYSQL_FIELD *fields;                                    // 结果集的列信息  
  6.   MYSQL_DATA *data;                                      // 结果集的数据  
  7.   MYSQL_ROWS *data_cursor;                        // 结果集的光标  
  8.   MEM_ROOT field_alloc;                                   // 内存结构  
  9.   MYSQL_ROW row;                                         // 非缓冲的时候用到  
  10.   MYSQL_ROW current_row;                           //mysql_store_result时会用到。当前行  
  11.   unsigned long *lengths;                                //每列的长度  
  12.   MYSQL *handle;                                           // mysql_use_result会用。  
  13.   my_bool eof;                                                 //是否为行尾  
  14. } MYSQL_RES;  
  15.   
  16.   
  17. <strong><span style="font-size:14px;">MYSQL_FIELD</span></strong>:包含各字段(列)的信息  
  18. typedef struct st_mysql_field {  
  19.   char *name;/* Name of column */  
  20.   char *table;                                            /* Table of column if column was a field */  
  21.   char *def;                                               /* Default value (set by mysql_list_fields) */  
  22.   enum enum_field_types type;                /* Type of field. Se mysql_com.h for types */  
  23.   unsigned int length;                               /* Width of column */  
  24.   unsigned int max_length;                       /* Max width of selected set */  
  25.   unsigned int flags;                                  /* Div flags */  
  26.   unsigned int decimals;                            /* Number of decimals in field */  
  27. } MYSQL_FIELD;    
  28.   
  29. <strong><span style="font-size:14px;">MYSQL_ROW</span></strong>:通俗的讲就是查询结果集(MYSQL_RES)的一行数据  
  30. typedef char **MYSQL_ROW;/* 返回的每一行的值,全部用字符串来表示*/  


示例

[cpp] view plain copy
  1. <pre name="code" class="cpp">#include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5.   
  6. int main()  
  7. {  
  8.     MySQL *mysql;  
  9.     mysql = mysql_init(mysql);  
  10.   
  11.     if(!mysql_real_connect(mysql, "localhost""root""""test", 0, NULL, 0))/*针对的是本地数据库且无密码的情况*/  
  12.     {  
  13.         cout << "Failed to connect to database. ERROR: "<<mysql_error(mysql) <<endl;  
  14.         exit(1);  
  15.     }  
  16.   
  17.     const char* query = "SELECT * FROM road"  
  18.     if(!mysql_query(mysql, query))  
  19.     {  
  20.         cout << "Failed to query data "<<endl;  
  21.         exit(1);  
  22.     }  
  23.   
  24.     MYSQL_RES res;  
  25.     MYSQL_ROW row;  
  26.     int numField = 0;  
  27.     unsigned long *len = NULL;  
  28.     char data[MAX_ROW][MAX_DATASIZE];  
  29.   
  30.     if(res = mysql_store_result(mysql))  
  31.     {  
  32.         numField = mysql_num_fields(res);  
  33.   
  34.         int j = 0;  
  35.   
  36.         while(row = mysql_fetch_row(res))/*最好加上范围判断,防止溢出,此处省略*/  
  37.         {  
  38.               
  39.             len = mysql_fetch_lengths(res);  
  40.                         for (int i = 0; i < numField; i++)  
  41.                 {  
  42.                         bcopy(row[i], &data[j][i*32], len[i]); /*len[i]在数据拷贝中很方便*/  
  43.                 }  
  44.                 j++;  
  45.         }  
  46.      }  
  47.      return 0;  
  48. }</pre>  
  49. <pre></pre>  
  50. <pre></pre>  
  51. <pre></pre>  
  52.      
0 0
原创粉丝点击