MySQL C++ 封装类

本文详细介绍了如何使用C++对MySQL数据库进行接口封装,包括连接管理、SQL语句执行、结果集处理等关键步骤,旨在提供一种高效、稳定的数据库操作方式。
//包含四个主要的类
/*
 1. K_Database  数据库
 2. k_Record    单条记录
 3. k_RecordSet 记录集合
 4. k_Field     字段信息

 K_mysql.h

 */
#ifdef WIN32
#include <winsock.h>
#else
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#endif

#include <string>
#include "mysql.h"
#include <vector>
using namespace std;
////////////////////////////////////

class k_sqlfactory
{
public:
 k_sqlfactory()
 {
  clean();
 }
 vector<string> name_list;
 vector<string> value_list;

 string where;
 string tablename;

 void clean()
 {
  name_list.clear();
  value_list.clear();
  where = "";
  tablename = "";
 };

 /*
  主要功能:插入新的记录
  返回值:0成功 -1 执行查询失败
  说明:以来 m_value m_field 提供的信息 生成sql 语句再查询
  */
 void add_value(string newname, string newvalue)
 {
  name_list.push_back(newname);
  value_list.push_back(newvalue);
 };
 string get_add()
 {

  if ((tablename.c_str() == "") || (this->tablename.empty()))
   return "-1";
  string sqltext = "INSERT INTO ";
  sqltext += tablename;
  sqltext += "(";
  int j = (int) this->name_list.size();
  int i;
  for (i = 0; i < j; i++)
  {

   sqltext += name_list[i];
   if (i < j - 1)
    sqltext += ",";
  }
  sqltext += ") VALUES (";
  j = (int) value_list.size();
  for (i = 0; i < j; i++)
  {
   sqltext += "'";
   sqltext += value_list[i];
   sqltext += "'";

   if (i < j - 1)
    sqltext += ",";

  }
  sqltext += ")";
  return sqltext;
 }
 string get_edit()
 {
  if ((tablename.c_str() == "") || (this->tablename.empty())
    || (this->where.c_str() == "") || (this->where.empty()))
   return "-1";
  string sqltext = "UPDATE ";
  sqltext += tablename;
  sqltext += " SET ";
  int j = (int) this->name_list.size();
  for (int i = 0; i < j; i++)
  {

   sqltext += name_list[i];
   sqltext += "='";
   sqltext += value_list[i];
   sqltext += "'";

   if (i < j - 1)
    sqltext += ",";

  }
  if (sqltext.find_last_of(",") == sqltext.length())
   sqltext.erase(sqltext.end());

  sqltext += " where (";
  sqltext += where;
  sqltext += ")";

  return sqltext;

 }
 /*
  主要功能:编辑制定的记录
  返回值:0成功 -1 执行查询失败
  说明:删除 m_where制定的条件 的记录 生成sql 语句再查询
  */
 string get_del()
 {
  string sqltext;

  if ((tablename.c_str() == "") || (this->tablename.empty())
    || (this->where.c_str() == "") || (this->where.empty()))
   return "-1";
  else
  {
   sqltext = "Delete  from ";
   sqltext += tablename;
   sqltext += " Where ";
   sqltext += where;

   return sqltext;

  }

 }
 /*
  主要功能:将二进制的数据转换未合法的sql文本
  失败返回:"-11"
  主要:仅仅限于1m以下的文件
  */
 string k_SreamRead(string filename, MYSQL* myData)
 {
  char buf[1024 * 300];//基本缓冲区
  char sql[1024 * 300 * 2];//sql缓冲区未实际大小的2
  int fleng;//文件长度
  int realleng;
  FILE* fp;
  fp = fopen(filename.c_str(), "rb");
  if (fp == NULL)
   return "--1";

  fseek(fp, 0, SEEK_END);
  fleng = ftell(fp);

  fseek(fp, 0, SEEK_SET);

  realleng = (int) fread(buf, sizeof(char), fleng, fp);

  mysql_real_escape_string(myData, sql, buf, realleng);

  fclose(fp);

  string temp;
  temp = sql;

  return temp;
 };

};
///////////////////////////////////////////////////////////////////////////////////////////

/*
 1 字段操作
 2
 */
///////////////////////////////////////////////////////////////////////////////////////////

class K_field
{
public:
 //属性
 vector<string> m_name;//字段名称
 vector<enum_field_types> m_type;//字段类型


public:
 //方法
 bool IsNum(int num)//是否是数字
 {
  if (IS_NUM(m_type[num]))
   return true;
  else
   return false;
 };
 bool IsNum(string num)//是否是数字
 {
  if (IS_NUM(m_type[GetField_NO(num)]))
   return true;
  else
   return false;

 };
 //-----------------------------------------------------------------------------------------------------------
 bool IsDate(int num)//是否是日期
 {
  if (m_type[num] == FIELD_TYPE_DATE || m_type[num]
    ==FIELD_TYPE_DATETIME)
   return true;
  else
   return false;
 };
 bool IsDate(string num)//是否是日期
 {
  int temp;
  temp = this->GetField_NO(num);

  if (m_type[temp] == FIELD_TYPE_DATE || m_type[temp]
    ==FIELD_TYPE_DATETIME)
   return true;
  else
   return false;
 };
 //-----------------------------------------------------------------------------------------------------------
 bool IsChar(int num)//是否是字符
 {
  if (m_type[num] == FIELD_TYPE_STRING || m_type[num]
    ==FIELD_TYPE_VAR_STRING || m_type[num] == FIELD_TYPE_CHAR)
   return true;
  else
   return false;

 };
 bool IsChar(string num)//是否是字符
 {
  int temp;
  temp = this->GetField_NO(num);
  if (m_type[temp] == FIELD_TYPE_STRING || m_type[temp]
    ==FIELD_TYPE_VAR_STRING || m_type[temp] == FIELD_TYPE_CHAR)
   return true;
  else
   return false;
 };
 //-----------------------------------------------------------------------------------------------------------
 bool IsBlob(int num)//是否为二进制数据
 {
  if (IS_BLOB(m_type[num]))
   return true;
  else
   return false;
 };
 bool IsBlob(string num)//是否为二进制数据
 {
  if (IS_BLOB(m_type[GetField_NO(num)]))
   return true;
  else
   return false;
 };
 //-----------------------------------------------------------------------------------------------------------
 int GetField_NO(string field_name)//得到制定字段的序号
 {

  for (unsigned int i = 0; i < m_name.size(); i++)
  {
   if (!m_name[i].compare(field_name))
    return i;

  }

  throw "字段不存在";

 };

};

///////////////////////////////////////////////////////////////////////////////////////////

/*
 1 单条记录
 2 [int ]操作 [""]操作
 */
///////////////////////////////////////////////////////////////////////////////////////////
class K_record
{
public:
 //属性
 vector<string> m_rs;//结果集
 K_field* m_field;//字段信息 回占用4字节的内存 当记录数很大是回产生性能问题!!!!!!!!!!!!!!!!!!!
public:
 //方法

 void k_record(K_field* m_f)
 {
  m_field = m_f;
 };
 void SetData(string value)
 {
  m_rs.push_back(value);
 }

 string operator[](string s)//[""]操作
 {
  return m_rs[m_field->GetField_NO(s)];
 };
 string operator[](int num)
 {
  return m_rs[num];
 };
 bool IsNull(int num)//null值判断
 {
  if (m_rs[num].c_str() == "")
   return true;
  else
   return false;

 };
 bool IsNull(string s)
 {
  if (m_rs[m_field->GetField_NO(s)].c_str() == "")
   return true;
  else
   return false;
 };
 //------------------------------------------------------------------------------
 /*
  主要-功能:用 value tab value 的形式 返回结果
  */
 std::string GetTabText()
 {
  string temp;
  for (unsigned int i = 0; i < m_rs.size(); i++)
  {
   temp += m_rs[i];
   if (i < m_rs.size() - 1)
    temp += "\\t";
  }
  return temp;
 };

 //----------------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////////////////

/*
 1 记录集合
 2 [int ]操作 [""]操作
 3 表结构操作
 4 数据的插入修改
 */
///////////////////////////////////////////////////////////////////////////////////////////

class K_recordSet
{
public:
 //属性
 vector<K_record> m_s;//记录集
 int m_recordcount;//记录数
 int m_field_num;//字段数
 K_field m_field;//字段信息
 //----------------------------------------------------//

 MYSQL_RES * res;
 MYSQL_FIELD * fd;
 MYSQL_ROW row;
 MYSQL* myData;

 //-----------------------------------------------------//
public:
 //方法
 K_recordSet()
 {

 };

 int GetRecordCount()
 {
  return m_recordcount;
 };//得到记录数目

 int GetFieldNum()
 {
  return m_field_num;
 };//得到字段数目

 K_field* GetField()
 {
  return &m_field;
 };//返回字段
 //---------------------------------------------------------------------------//

 //----------------------------------------------------------------------------------------

 /*
  主要功能:返回制定的结果集
  参数:no. 记录序号

  */
 K_record operator[](int num)//返回制定序号的记录
 {
  return this->m_s[num];
 };

 //-----------------------------------------------------------------------------------------


 //--------------------------------------------------------------------------------------------
};

///////////////////////////////////////////////////////////////////////////////////////////

/*
 1 负责数据库的连接关闭
 2 执行sql 语句(不返回结果)
 3 处理事务
 */
///////////////////////////////////////////////////////////////////////////////////////////
class K_Database
{

public:
 K_Database()
 {
 };

public:
 //属性
 MYSQL* myData;//msyql 连接句柄

public:
 //方法

 //-----------------------------------------------------------------------
 /*
  主要功能:连接数据库
  参数说明:
  1 host 主机ip地址或者时主机名称
  2 user 用户名
  3 passwd 密码
  4 db 欲连接的数据库名称
  5 port 端口号  默认 3306
  6 client_flag 客户连接参数 一般设置为 0
  7 charset 数据库的连接字符集 默认为 "GBK"
  返回值: 0成功 -1 失败

  */
 int Connect(string host, string user, string passwd, string db,
   unsigned int port=3306, unsigned long client_flag=0, string charset="GBK")
 {
     myData = mysql_init((MYSQL*) 0);
  if( NULL==myData )
     {
           return -1;
     }
  //设置字符集
  if(mysql_options(myData,MYSQL_SET_CHARSET_NAME,charset.c_str()) != 0 )
  {
      return -1;
  }

  if ( mysql_real_connect(myData,
                          host.c_str(),
                          user.c_str(),
                          passwd.c_str(),
                          db.c_str(),
                          port,
                    NULL,
                    client_flag) )
  {
   if (mysql_select_db(myData, db.c_str()) < 0) //选择制定的数据库失败
   {
    mysql_close(myData);
    return -1;
   }
  }
  else
  {

   mysql_close(myData);//初始化mysql结构失败
   return -1;
  }
  return 0;//成功
 };
 //---------------------------------------------------------------------
 /*
  主要功能:关闭数据库连接
  */
 void DisConnect()
 {
  mysql_close(myData);
 };
 //---------------------------------------------------------------------
 /*
  主要功能: 执行非返回结果查询
  参数:
  1 sql 待执行的查询语句
  返回值; n为成功 表示受到影响的行数 -1 为执行失败

  */
 int ExecQuery(string sql)
 {
  if (!mysql_real_query(myData, sql.c_str(), (unsigned long) sql.length()))
  {
   return (int) mysql_affected_rows(myData);//得到受影响的行数
  }
  else
  {
   return -1;
  }//执行查询失败

 };
 //----------------------------------------------------------------------------------
 /*
  主要功能:测试mysql服务器是否存活
  返回值:0 表示成功 -1 失败
  */
 int Ping()
 {
  if (!mysql_ping(myData))
   return 0;
  else
   return -1;

 };
 //-----------------------------------------------------------------------
 /*
  主要功能:关闭mysql 服务器
  返回值;0成功 -1 失败
  */
 int ShutDown()
 {
  /*if( ! mysql_shutdown(myData) )
   return 0;
   else
   return -1;*/
  return 0;
 };
 //-----------------------------------------------------------------------
 /*
  主要功能:重新启动mysql 服务器
  返回值;0表示成功 -1 表示失败
  */
 int Reload()
 {
  if (!mysql_reload(myData))
   return 0;
  else
   return -1;
 };
 //-----------------------------------------------------------------------
 // 说明:事务支持InnoDB or BDB表类型
 //-----------------------------------------------------------------------
 /*
  主要功能:开始事务
  返回值:0 表示成功 -1 表示失败
  */
 int Start_Transaction()
 {
  if (!mysql_real_query(myData, "START TRANSACTION",
    (unsigned long) strlen("START TRANSACTION")))
  {
   return 0;
  }
  else
  {
   return -1;
  }//执行查询失败


 }
 //-----------------------------------------------------------------------
 /*
  主要功能:提交事务
  返回值:0 表示成功 -1 表示失败
  */
 int Commit()
 {

  if (!mysql_real_query(myData, "COMMIT",
    (unsigned long) strlen("COMMIT")))
  {
   return 0;
  }
  else
  {
   return -1;
  }//执行查询失败

 }
 //--------------------------------------------------------------------------
 /*
  主要功能:回滚事务
  返回值:0 表示成功 -1 表示失败
  */
 int Rollback()
 {

  if (!mysql_real_query(myData, "ROLLBACK", (unsigned long) strlen(
    "ROLLBACK")))
   return 0;

  else
  {
   return -1;
  }//执行查询失败

 };
 //--------------------------------------------------------------------------
 /*主要功能:得到客户信息*/
 string Get_client_info()
 {
  return mysql_get_client_info();
 };
 //--------------------------------------------------------------------------
 /*主要功能:得到客户版本信息*/
 //   int Get_client_version() { return mysql_get_client_version(); };
 //--------------------------------------------------------------------------
 /*主要功能:得到主机信息*/
 string Get_host_info()
 {
  return mysql_get_host_info(myData);
 };
 //--------------------------------------------------------------------------
 /*主要功能:得到服务器信息*/
 string Get_server_info()
 {
  return mysql_get_server_info(myData);
 };
 //--------------------------------------------------------------------------
 /*主要功能:得到服务器版本信息*/
 //   int  Get_server_version() {return mysql_get_server_version(myData) ; };

 //--------------------------------------------------------------------------
 /*主要功能:得到 当前连接的默认字符集*/
 string Get_character_set_name()
 {
  return mysql_character_set_name(myData);
 };
 //---------------------------------------------------------------------------
 //主要功能返回单值查询
 string ExecQueryGetSingValue(string sql)
 {
  MYSQL_RES * res;
  MYSQL_ROW row;

  if (!mysql_real_query(myData, sql.c_str(), (unsigned long) sql.length()))
  {

   res = mysql_store_result(myData);//保存查询结果
   row = mysql_fetch_row(res);

   return ((row[0] == NULL) || (!strlen(row[0]))) ? "--1" : row[0];

   mysql_free_result(res);

  }
  else
  {
   return "--1";
  }//执行查询失败
 };
 //------------------------------------------------------------------------------------
 //得到系统时间
 string GetSysTime()
 {
  return ExecQueryGetSingValue("select now()");
 };
 //---------------------------------------------------------------------------------
 /*
  主要功能:建立新数据库
  参数:name 为新数据库的名称
  返回:0成功 -1 失败
  */
 int Create_db(string name)
 {
  string temp;
  temp = "CREATE DATABASE ";
  temp += name;
  if (!mysql_real_query(myData, temp.c_str(),
    (unsigned long) temp.length()))
   return 0;

  else
  {
   return -1;
  }//执行查询失败

 };
 //----------------------------------------------------------------------------
 /*
  主要功能:删除制定的数据库
  参数:name 为欲删除数据库的名称
  返回:0成功 -1 失败
  */
 int Drop_db(string name)
 {
  string temp;
  temp = "DROP DATABASE ";
  temp += name;
  if (!mysql_real_query(myData, temp.c_str(),
    (unsigned long) temp.length()))
   return 0;

  else
  {
   return -1;
  }//执行查询失败

 };
 int ExecQueryGetRecord(string sql, K_recordSet& Record)
 {
  int i, j;

  if (!mysql_real_query(myData, sql.c_str(), (unsigned long) sql.length()))//执行查询
  {

   Record.res = mysql_store_result(myData);//保存查询结果

   i = (int) mysql_num_rows(Record.res); //得到记录数量
   Record.m_recordcount = i;//保存记录数
   j = mysql_num_fields(Record.res);//得到字段数量
   Record.m_field_num = j;//保存字段数


   for (int x = 0; Record.fd = mysql_fetch_field(Record.res); x++)
   {
    Record.m_field.m_name.push_back(Record.fd->name);
    Record.m_field.m_type .push_back(Record.fd->type);

   }

   //....
   while (Record.row = mysql_fetch_row(Record.res))
   {
    K_record temp;

    for (int k = 0; k < j; k++)
    {

     if (Record.row[k] == NULL || (!strlen(Record.row[k])))
     {
      temp.SetData("");
     }
     else
     {

      temp.SetData(Record.row[k]);
     }

    }

    Record.m_s.push_back(temp); //添加新记录
   }
   mysql_free_result(Record.res);
   return (int) Record.m_s.size();
  }
  else
   return -1;//查询执行失败;

 };

};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值