📄 new_dbmysql.cpp
字号:
#ifndef DB_MYSQL_H
#define DB_MYSQL_H
#include <winsock2.h>
#include <mysql/mysql.h>
#include <string>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
class MyFields {
public:
string name;//列名
string def;//列的缺省值
unsigned long length;//列的长度
unsigned long max_length;//最大长度
//缺省构造函数
MyFields(){}
//拷贝构造函数
MyFields(const MyFields& ob)
{
name = ob.name;//列名
def = ob.def;//列的缺省值
length = ob.length;//列的长度
max_length = ob.max_length;//最大长度
}
//重载=
void operator=(const MyFields& ob)
{
name = ob.name;//列名
def = ob.def;//列的缺省值
length = ob.length;//列的长度
max_length = ob.max_length;//最大长度
}
//析构函数
~MyFields(){}
};
typedef map<int,string > strMap;
typedef map<int,MyFields> Fields_info;
/*mysql操作类,封装了c语言相关的api,可实现基本的查询、插入、修改和删除动作*/
class DBMysql
{
protected:
MYSQL *mysql; //代表一个到数据库的连接
private:
string host; //连接的服务器
string user; //用户名
string password; //连接密码
unsigned int port; //连接端口
string db; //操作的数据库的名称
string query; //sql语句
string error; //错误提示信息
unsigned int debug; //是否显示调试信息
vector<strMap> arrInfo; //查询语句可能会返回多条结果
Fields_info fields; //返回查询结果的列
unsigned long num;//查询影响的行数
void disPlayError();
public:
DBMysql(string host,string user,string password,string db,unsigned int port);// 构造函数
DBMysql(){} //构造函数
void SetConnect(string host,string user,string password,string db,unsigned int port);//确定连接
//参数
unsigned int DBConnect();//连接数据库
unsigned int DBSelect(string db); //连接一个数据库
int SetQuery(string q); //设定查询语句
int DBQuery(); //查询数据库,执行sql语句,查询成功返回0,非查询语句返回1,错误返回-1
void SetArray(MYSQL_RES *result); //返回查询得到的结果
string GetError(); //返回错误信息
void SetFields(MYSQL_RES *result);//返回查询后的列的信息
unsigned long GetLastID(); //返回最后一个自动增量的值
unsigned long GetNum(); //返回一条sql语句影响的行数
Fields_info GetFields(){return fields;}//返回查询列信息
string GetFields_name(int i){return fields[i].name;}//返回查询列名称
unsigned int GetFields_length(int i){return fields[i].length;}//返回查询列的长度
unsigned int GetFields_max_length(int i){return fields[i].max_length;} //返回查询列的最大长
vector<strMap> GetArray(){return arrInfo;}//返回查询结果集
strMap GetArray(int i){return arrInfo[i];} //返回查询结果集中指定的行
int GetFields_num(){return fields.size();}
~DBMysql();//析构函数
};
#endif
/*构造函数,设定连接的服务器,用户名,密码和端口*/
DBMysql::DBMysql(string host,string user,string password,string data,unsigned int port=3306)
{
mysql = mysql_init(NULL);
num = 0;
error="";
query="";
SetConnect(host,user,password,data,port);
DBConnect();
}
/*设定连接的服务器,用户名,密码和端口*/
void DBMysql::SetConnect(string host,string user,string password,string data,unsigned int port)
{
DBMysql::host = host;
DBMysql::user = user;
DBMysql::password = password;
DBMysql::port = port;
DBMysql::db = data;
}
/*连接数据库*/
unsigned int DBMysql::DBConnect()
{
MYSQL *con;
if(mysql == NULL)
{
error = "初始化mysql错误";
return 1;
}
con = mysql_real_connect(mysql,host.c_str(),user.c_str(),password.c_str(),NULL,port,NULL,0);
if(con == NULL)
{
error=mysql_error(mysql);
return mysql_errno(mysql);
}
DBSelect(db);
return 0;
}
/*选择一个数据库*/
unsigned int DBMysql::DBSelect(string database)
{
unsigned int re;
if( mysql == NULL) return 1;
db = database;
re = mysql_select_db(mysql,db.c_str());
if(re != 0)
{
error+=mysql_error(mysql);
}
return re;
}
/*设定sql语句*/
int DBMysql::SetQuery(string q)
{
assert(!q.empty());
query = q;
return DBQuery();
}
/*执行sql语句,查询成功返回0,非查询语句返回1,错误返回-1*/
int DBMysql::DBQuery()
{
unsigned int re;
MYSQL_RES *result; //操作的结果
num = 0;
if( mysql == NULL) return 1;
assert(!query.empty());
arrInfo.clear();
fields.clear();
re = mysql_query(mysql,query.c_str());
if(re == 0)
{
result = mysql_store_result(mysql);
if(result)
{
num = mysql_affected_rows(mysql);
SetFields(result);
SetArray(result);
mysql_free_result(result);
return 0;
}
else
{
if(mysql_field_count(mysql)==0)
{
num = mysql_affected_rows(mysql);
return 1;
}
else
{
num = 0;
error+="Error in reading result set:";
error+=mysql_error(mysql);
return -1;
}
}
}
else
{
re = mysql_errno(mysql);
error = mysql_error(mysql);
cout<<error<<endl;
return -1;
}
}
/*获取查询得到的所有结果*/
void DBMysql::SetArray(MYSQL_RES *result)
{
MYSQL_ROW row;
int i;
int field_num=fields.size();
strMap tmp;
assert(mysql != NULL);
while(row = mysql_fetch_row(result))
{
if(row != NULL)
{
for(i=0;i<field_num;i++)
{
tmp[i] = (char *)row[i];
}
arrInfo.push_back(tmp);
}
}
}
/*获取sql语句执行影响的行数*/
unsigned long DBMysql::GetNum()
{
return num;
}
/*获取插入后的id号*/
unsigned long DBMysql::GetLastID()
{
return mysql_insert_id(mysql);
}
/*获取返回的错误信息*/
string DBMysql::GetError()
{
return error;
}
/*返回查询后的列值*/
void DBMysql::SetFields(MYSQL_RES *result)
{
MYSQL_FIELD *field;
MyFields tmp_fields;
assert(mysql != NULL);
int i=0;
mysql_field_seek(result,0);
while(field = mysql_fetch_field(result))
{
tmp_fields.name=field->name;
tmp_fields.length=field->length;
tmp_fields.max_length=field->max_length;
tmp_fields.def=field->def;
fields[i]=tmp_fields;
i++;
}
}
/*析构函数*/
DBMysql::~DBMysql()
{
fields.clear();
error="";
db="";
arrInfo.clear();
mysql_close(mysql);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -