有了MySQL API的支持,C++是连上数据库了,可是每次都去查API函数表,总是比较麻烦的……为了体现“代码重用”思想,你可以为自己做一个调用MySQL的类,把繁琐的操作封装成简单的函数,为今后使用做准备。
常用的函数
初始化API库:mysql_library_init()
初始化数据结构:mysql_init()
连接数据库前的选项:mysql_options()
错误信息:mysql_error()
连接函数:mysql_real_connect()
执行SQL语句:mysql_query()
转存查询结果:mysql_store_result()
关闭连接:mysql_close()
dbctrl.h
#ifndef __DBCTRL_H__ #define __DBCTRL_H__ #include "winsock.h" #include "iostream.h" #include <string> #include "mysql.h" #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "libmysql.lib") using namespace std; class DBctrl { private: MYSQL mydata; //MySQL对象,必备的一个数据结构 MYSQL_RES *result; //用于存放结果 建议用char* 数组将此结果转存 public: int row; //查询结果的行数 int field; //查询结果的列数 int autoNum; //上一次auto_increment的值 int errorNum; //错误代号 const char* errorInfo; //错误提示 int affectedRow; //上一次查询影响的行数 DBctrl(); //构造函数 void DBtest(int flag); void DBerror(); void DBconn(char* server, char* username, char* password, char* database,int port); void DBquery(string queryStr); void DBquery(string queryStr, char* data[100][100]); void DBclose(); }; #endif
dbctrl.cpp
#include "dbctrl.h" //构造函数 初始化各个变量和数据 DBctrl::DBctrl() { mysql_library_init(0,NULL,NULL); mysql_init(&mydata); mysql_options(&mydata,MYSQL_SET_CHARSET_NAME,"gbk"); row=0; field=0; autoNum=0; errorNum=0; errorInfo="ok"; affectedRow=0; } //编译时显示测试信息,正式使用时把此函数主题注释掉即可 void DBctrl::DBtest(int flag) { char* message; switch (flag) { case 1: message="Database OK!"; break; case 2: message="Database error!"; break; case 3: message="Query OK!"; break; case 4: message="Query error!"; break; case 5: message="data overflew!"; break; default: message=NULL; break; } if (message!=NULL) cout<<message<<endl; } //收集错误信息 void DBctrl::DBerror() { errorNum=mysql_errno(&mydata); errorInfo=mysql_error(&mydata); } //连接数据库 void DBctrl::DBconn(char* server, char* username, char* password, char* database,int port) { char* svr=server; //server:服务器域名或IP char* usr=username; //username:数据库用户名 char* pwd=password; //password:数据库密码 char* dbn=database; //database:数据库名 int prt=port; //port:端口号 //这里新建变量并再赋一次值是为了调试的时候显示连接参数,其实可以不这么做 if(mysql_real_connect(&mydata,svr,usr,pwd,dbn,prt,0,0) != NULL) DBtest(1); else DBtest(2); } //执行查询语句 void DBctrl::DBquery(string queryStr) { if(0==mysql_query(&mydata,queryStr.c_str())) DBtest(3); else DBtest(4); DBerror(); } //执行查询语句(重载,有返回结果的) void DBctrl::DBquery(string queryStr, char* data[100][100]) { if(0==mysql_query(&mydata,queryStr.c_str())) DBtest(3); else DBtest(4); affectedRow=mysql_affected_rows(&mydata); autoNum=mysql_insert_id(&mydata); result=mysql_store_result(&mydata); row=mysql_num_rows(result);//计算行数 field=mysql_num_fields(result);//计算列数 //转出数据 if(row>100 || field>100) DBtest(5); else { MYSQL_ROW line=NULL; line=mysql_fetch_row(result);//取第一行结果 int j=0; while(NULL!=line)//查看是否为空行,是则结束,否则将这一行的数据转存到data的一行中并取下一行 { for(int i=0; i<field;i++) { data[j][i]=line[i]; } j++; line=mysql_fetch_row(result); } } DBerror(); } //断开连接 void DBctrl::DBclose() { mysql_close(&mydata); }
主体
#include "dbctrl.h" void main() { DBctrl my; //刚才建的通用类 string query; //存放查询语句 char* data[100][100]; //存放查询结果 query="Select * from table1"; my.DBconn("localhost","root","123456","test",3306); my.DBquery(query,data); //执行query中的语句,并将结果回送给data my.DBclose(); //关闭连接 /* 此处用for循环显示data数组的内容... */ }