⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 new_dbmysql.cpp

📁 自已封装的MYSQL C API
💻 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 + -