使用C++封装的跨平台mysql8.0 SDK(含代码)

本文主要分享使用C++封装的mysql8.0代码,目前已完成mysql库的封装,该代码支持windows和linux的跨平台编译。目前手头工作较多,等到春节假期会补充代码解析,以及另一篇文章的SQL语句解析。现在先贴上github地址,和大家分享代码。
部分代码如下,全部代码和工程可在我的github进项下载:
对于代码设计不合理的地方,欢迎大家提出建议,可采纳的我会进行修改😊
代码地址:https://github.com/liuty-github/mysdk/tree/master/sql

tmysql.h
#ifndef __TCLASS_MYSQL_H__
#define __TCLASS_MYSQL_H__
#include "common/db_common.h"
#include "Tmysql_type.h"
#include <common/mysql_include/mysql.h>

class Tmysql
{
public:
	//初始化Mysql API
	DB_ERR Init();

	//清理占用的所有资源
	DB_ERR Finit();

	//数据库连接(不考虑线程安全) flag设置支持多条语句
	DB_ERR Connect(const char*host, const char*user, const char*pass, const char*db, unsigned short port = 3306, unsigned long flag = 0);

	//创建数据库
	DB_ERR CreateDatabase(std::string &dbname);

	//删除数据库
	DB_ERR DeleteDatabase(std::string &dbname);

	//创建表
	DB_ERR CreateTable(TTABLEVECTOR &tvector, std::string &tablename, TABLE_TYPE tabletype);

	//删除表
	DB_ERR DeleteTable(std::string &tablename);

	/*****************************************增**************************************************/
	//插入非二进制数据
	DB_ERR Insert(TDATAMAP &kv, std::string &tablename);

	//插入二进制数据
	DB_ERR InsertBin(TDATAMAP &kv, std::string &tablename);

	/*****************************************删**************************************************/
	//删除指定ID的数据
	DB_ERR DropWithId(std::string &tablename, std::string &idname, std::string &idnum);

	//删除包含指定字段的数据
	DB_ERR LikeDrop(std::string &tablename, std::string &fieldname, std::string &fielddata);

	//清空表,berecover传true,清空后不可恢复;传false清空后不可恢复
	DB_ERR DropWithTable(std::string &tablename, bool brecover = true);

	/*****************************************改**************************************************/
	//返回更新数量,失败返回-1
	TUINT64 Update(TDATAMAP &kv, std::string &tablename, std::string &where, std::string &idnum);

	//更新二进制数据
	TUINT64 UpdateBin(TDATAMAP &kv, std::string &tablename, std::string &where, std::string &idnum);

	/*****************************************查**************************************************/
	//select from查表,配合结果集接口使用
	DB_ERR Select(std::string &tablename);

	//like 模糊查找,配合结果集接口使用
	DB_ERR Like(std::string &tablename, std::string &fieldname, std::string &fielddata);

	//结果集获取返回全部结果
	DB_ERR StoreResult();

	//开始接收结果,通过Fetch获取
	DB_ERR UseResult();

	//释放结果集占用的空间
	DB_ERR FreeResult();

	//获取一行数据
	TROW FetchRow();

	//简易接口,返回select的数据结果,每次调用清理上一次的结果集
	DB_ERR EasySelect(std::string &tablename, TROWS &rows);

	//简易接口,模糊查找
	DB_ERR EasyLike(std::string &tablename, std::string &fieldname,std::string &fielddata, TROWS &rows);

	/*****************************************设置************************************************/
	//切换mysql当前编码格式
	DB_ERR SwitchType(TABLE_TYPE ttype);

	//Mysql参数的设定 Connect之前调用
	DB_ERR Options(LX_OPT opt, const void *arg);

	//连接超时时间
	DB_ERR SetConnectTimeout(int sec);

	//自动重连,默认不自动
	DB_ERR SetReconnect(bool isre = true);

	/*****************************************事务************************************************/
	//开始事务
	DB_ERR StartTransaction();

	//结束事务
	DB_ERR StopTransaction();

	//提交
	DB_ERR Commit();

	//回滚
	DB_ERR Rollback();

	//执行sql语句  if sqllen=0 strlen获取字符长度
	bool Query(const char*sql, unsigned long sqllen = 0);

private:
	//生成insert sql语句
	std::string GetInsertSql(TDATAMAP &kv, std::string &tablename);

	//获取更新数据的sql语句 where语句中,用户要包含where
	std::string GetUpdateSql(TDATAMAP &kv, std::string &tablename, std::string &where, std::string &idnum);

	//根据结构体获取创建表对应域的sql语句
	std::string GetCreateSql(LPTABLESTRUCT pfield);

	//根据域类型获得相应字符串
	std::string GetTypeString(TABLE_DATA_TYPE gbkorutf);

protected:
	//mysql上下文
	MYSQL *mysql = 0;

	//结果集
	MYSQL_RES *result = 0;

	//字段名称和类型
	//std::vector<TData> cols;
};




#endif // !__TCLASS_MYSQL_H__



tmysql.cpp
#include "Tmysql.h"
#include "common/db_tools.h"

#if defined( __WIN32__ ) || defined( WIN32 ) || defined( _WIN32 )
#pragma comment(lib,"libmysql.lib")
#endif

using namespace std;
DB_ERR Tmysql::Init()
{
	Finit();
	cout << "Tmysql::Init()" << endl;
	//新创建一个MYSQL 对象
	mysql = mysql_init(0);
	if (!mysql)
	{
		cerr << "mysql_init failed!" << endl;
		return DB_FAILDE;
	}
	Tprint("mysql_init success, mysql = %p",mysql);
	return DB_SUCCESS;
}

//清理占用的所有资源
DB_ERR Tmysql::Finit()
{
	FreeResult();

	if (mysql)
	{
		mysql_close(mysql);
		mysql = NULL;
		Tprint("Tmysql::finit()");
		return DB_SUCCESS;
	}
	return DB_FAILDE;
}

//创建数据库
DB_ERR Tmysql::CreateDatabase(std::string &dbname)
{
	if (dbname.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	//string sql = "CREATE DATABASE IF NOT EXISTS `" + dbname + "`";
	//return Query(sql.c_str()) ? DB_SUCCESS : DB_FAILDE;
	std::string queryStr = "create database if not exists ";
	queryStr += dbname;
	if (Query(queryStr.c_str()))
	{
		queryStr = "use ";
		queryStr += dbname;
		if (Query(queryStr.c_str()))
		{
			Tprint("database %s create success", dbname.c_str());
			return DB_SUCCESS;
		}
	}
	Tprint("database %s create faield", dbname.c_str());
	return DB_FAILDE;
}

//删除数据库
DB_ERR Tmysql::DeleteDatabase(std::string &dbname)
{
	if (dbname.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	std::string queryStr = "create database if not exists ";
	queryStr += dbname;
	if (Query(queryStr.c_str()))
	{
		queryStr = "drop database `";
		queryStr += dbname;
		queryStr += "`";
		if (Query(queryStr.c_str()))
		{
			Tprint("database %s delete success", dbname.c_str());
			return DB_SUCCESS;
		}
	}
	Tprint("database %s delete faield", dbname.c_str());
	return DB_FAILDE;
}

//数据库连接(不考虑线程安全) flag设置支持多条语句
DB_ERR Tmysql::Connect(const char*host, const char*user, const char*pass, const char*db, unsigned short port, unsigned long flag)
{
	if (!mysql && !Init())
	{
		cerr << "Mysql connect failed! msyql is not init!" << endl;
		return DB_FAILDE;
	}
	if (!mysql_real_connect(mysql, host, user, pass, db, port, 0, flag))
	{
		cerr << "Mysql connect failed!" << mysql_error(mysql) << endl;
		return DB_FAILDE;
	}
	Tprint("mysql connect success!");
	return DB_SUCCESS;
}

DB_ERR Tmysql::SwitchType(TABLE_TYPE ttype)
{
	bool bresult = false;
	string stype;
	switch (ttype)
	{
	case GBK:bresult = Query("set names gbk"); stype = "gbk"; break;
	case UTF8:bresult = Query("set names utf8"); stype = "utf8"; break;
	case NOTYPE:bresult = true; break;
	default:break;
	}
	Tprint("switchtype to %s return %s\n", stype.c_str(), g_errstring[bresult ? DB_SUCCESS : DB_FAILDE]);
	return bresult ? DB_SUCCESS : DB_FAILDE;
}

bool Tmysql::Query(const char*sql, unsigned long sqllen)
{
	if (!mysql)
	{
		Tprint( "Query failed:mysql is NULL" );
		return false;
	}
	if (!sql)
	{
		Tprint("sql is null" );
		return false;
	}
	if (sqllen <= 0)
		sqllen = (unsigned long)strlen(sql);
	if (sqllen <= 0)
	{
		Tprint("Query sql is empty or wrong format!" );
		return false;
	}

	int re = mysql_real_query(mysql, sql, sqllen);
	if (re != 0)
	{
		Tprint("mysql_real_query failed! error is:%s" , mysql_error(mysql) );
		return false;
	}
	return true;

}

//Mysql参数的设定
DB_ERR Tmysql::Options(LX_OPT opt, const void *arg)
{
	if (!mysql)
	{
		Tprint("Option failed:mysql is NULL" );
		return DB_FAILDE;
	}
	int re = mysql_options(mysql, (mysql_option)opt, arg);
	if (re != 0)
	{
		Tprint("mysql_options failed!error is:%s" , mysql_error(mysql) );
		return DB_FAILDE;
	}
	return DB_SUCCESS;
}

//连接超时时间
DB_ERR Tmysql::SetConnectTimeout(int sec)
{
	return Options(LX_OPT_CONNECT_TIMEOUT, &sec);
}

//自动重连,默认不自动
DB_ERR Tmysql::SetReconnect(bool isre)
{
	return Options(LX_OPT_RECONNECT, &isre);
}

//select
DB_ERR Tmysql::Select(std::string &tablename)
{
	if (tablename.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	string sql = "select * from " + tablename;
	return (Query(sql.c_str()) == true) ? DB_SUCCESS : DB_FAILDE;
}

//like
DB_ERR Tmysql::Like(std::string &tablename, std::string &fieldname, std::string &fielddata)
{
	if (tablename.empty() || fieldname.empty() || fielddata.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	string sql = "select * from " + tablename + " where " + fieldname + " like '%" + fielddata + "%'";
	return (Query(sql.c_str()) == true) ? DB_SUCCESS : DB_FAILDE;
}

//返回全部结果
DB_ERR Tmysql::StoreResult()
{
	if (!mysql)
	{
		Tprint("StoreResult failed:mysql is NULL" );
		return DB_FAILDE;
	}
	FreeResult();
	result = mysql_store_result(mysql);
	if (!result)
	{
		Tprint("mysql_store_result failed!error is:%s", mysql_error(mysql));
		return DB_FAILDE;
	}
	return DB_SUCCESS;
}

//开始接收结果,通过Fetch获取
DB_ERR Tmysql::UseResult()
{
	if (!mysql)
	{
		Tprint("UseResult failed:mysql is NULL");
		return DB_FAILDE;
	}
	FreeResult();
	result = mysql_use_result(mysql);
	if (!result)
	{
		Tprint("mysql_use_result failed!erorr is:%s", mysql_error(mysql));
		return DB_FAILDE;
	}
	return DB_SUCCESS;
}

//释放结果集占用的空间
DB_ERR Tmysql::FreeResult()
{
	if (result)
	{
		mysql_free_result(result);
		result = NULL;
		return DB_SUCCESS;
	}
	return DB_FAILDE;
}

//删除指定ID的数据
DB_ERR Tmysql::DropWithId(std::string &tablename, std::string &idname, std::string &idnum)
{
	//delete FROM A WHERE id = 'B' 
	if (tablename.empty() || idname.empty() || idnum.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_DATA;
	}
	string sql = "delete from " + tablename + " where " + idname + "=" + idnum;
	if (!Query(sql.c_str()))
	{
		Tprint("drop faield in table:%s, col:%s, data:%s\n", tablename.c_str(), idname.c_str(), idnum.c_str());
		return DB_FAILDE;
	}
	Tprint("drop success in table:%s, col:%s, data:%s\n", tablename.c_str(), idname.c_str(), idnum.c_str());
	return DB_SUCCESS;
}
//删除包含指定字段的数据
DB_ERR Tmysql::LikeDrop(std::string &tablename, std::string &fieldname, std::string &fielddata)
{
	//DELETE from tablename where 字段名 like '%字段值%'
	if (tablename.empty() || fieldname.empty() || fielddata.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_DATA;
	}
	string sql = "delete from " + tablename + " where `" + fieldname + "` like '%" + fielddata + "%'";
	if (!Query(sql.c_str()))
	{
		Tprint("drop faield in table:%s, col:%s, data:%s\n", tablename.c_str(), fieldname.c_str(), fielddata.c_str());
		return DB_FAILDE;
	}
	Tprint("drop success in table:%s, col:%s, data:%s\n", tablename.c_str(), fieldname.c_str(), fielddata.c_str());
	return DB_SUCCESS;
}
//清空表
DB_ERR Tmysql::DropWithTable(std::string &tablename, bool brecover)
{
	if (tablename.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_DATA;
	}
	//DELETE FROM `tablename`;可恢复
	//TRUNCATE TABLE `tablename`;不可恢复
	string sql = "";
	if (brecover == true)
	{
		sql += "DELETE FROM `";
	}
	else
	{
		sql += "TRUNCATE TABLE `";
	}
	sql += tablename;
	sql += "`";
	if (Query(sql.c_str()) == false)
	{
		Tprint("drop faield in table:%s", tablename.c_str());
		return DB_FAILDE;
	}
	Tprint("drop success in table:%s", tablename.c_str());
	return DB_SUCCESS;
}
//获取一行数据
TROW Tmysql::FetchRow()
{
	TROW re;
	if (!result)
	{
		Tprint("reult is null");
		return re;
	}
	MYSQL_ROW row = mysql_fetch_row(result);
	if (!row)
	{
		Tprint("row is null");
		return re;
	}

	//列数
	int num = mysql_num_fields(result);

	unsigned long *lens = mysql_fetch_lengths(result);
	for (int i = 0; i < num; i++)
	{
		TData data;
		data.data = row[i];
		data.size = lens[i];
		//获取列的类型
		auto field = mysql_fetch_field_direct(result, i);
		data.type = (FIELD_TYPE)field->type;
		re.push_back(data);
	}
	Tprint("return success");
	return re;
}

std::string Tmysql::GetTypeString(TABLE_DATA_TYPE gbkorutf)
{
	std::string typestring = g_datatype[gbkorutf];
	return typestring;
}

std::string Tmysql::GetCreateSql(LPTABLESTRUCT pfield)
{
	std::string fieldsql = "`" + pfield->fieldname + "` ";
	fieldsql += GetTypeString(pfield->type);
	if (pfield->len != 0)
	{
		fieldsql += "(";
		fieldsql += to_string(pfield->len);
		fieldsql += ")";
	}
	if (pfield->gbkorutf == GBK)
	{
		fieldsql += " CHARACTER SET gbk COLLATE gbk_bin";
	}
	else if (pfield->gbkorutf == UTF8)
	{
		fieldsql += " CHARACTER SET utf8 COLLATE utf8_bin";
	}
	else//NOTYPE才考虑是否将此字段设为自增ID
	{
		if (pfield->type == DBTYPE_ID)
		{
			fieldsql += ",PRIMARY KEY(`";
			fieldsql += pfield->fieldname;
			fieldsql += "`)";
		}
	}
	return fieldsql;
}

DB_ERR Tmysql::CreateTable(TTABLEVECTOR &tvector, std::string &tablename, TABLE_TYPE tabletype)
{
	if (tvector.empty() || tablename.empty() || tabletype > NOTYPE)
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	/*"CREATE TABLE IF NOT EXISTS `t_utf8` \
		(`id` INT AUTO_INCREMENT,	\
		`name` VARCHAR(1024) CHARACTER SET utf8 COLLATE utf8_bin,\
		PRIMARY KEY(`id`))";*/
	string sql = "CREATE TABLE IF NOT EXISTS `" + tablename + "` (";
	TTABLEVECTOR::iterator iter = tvector.begin();
	for (;iter != tvector.end(); ++iter)
	{
		sql += GetCreateSql(&(*iter));
		sql += ",";
	}
	sql[sql.size() - 1] = ' ';
	sql += ")";
	Tprint("%s\n", sql.c_str());
	return Query(sql.c_str()) == true ? DB_SUCCESS : DB_FAILDE;
}

DB_ERR Tmysql::DeleteTable(std::string &tablename)
{
	if (tablename.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	string sql = "DROP TABLE IF EXISTS `" + tablename + "`";
	return Query(sql.c_str()) == true ? DB_SUCCESS : DB_FAILDE;
}

//生成insert sql语句
std::string Tmysql::GetInsertSql(TDATAMAP &kv, std::string &tablename)
{
	string sql = "";
	sql = "insert into `";
	sql += tablename;
	sql += "`";
	//insert into t_video (name,size) values("name1","1024")
	string keys = "";
	string vals = "";

	//迭代map
	for (TDATAMAP::iterator ptr = kv.begin(); ptr != kv.end(); ptr++)
	{
		//字段名
		keys += "`";
		keys += ptr->first;
		keys += "`,";

		vals += "'";
		vals += ptr->second.data;
		vals += "',";
	}
	//去除多余的逗号
	keys[keys.size() - 1] = ' ';
	vals[vals.size() - 1] = ' ';

	sql += "(";
	sql += keys;
	sql += ")values(";
	sql += vals;
	sql += ")";
	return sql;
}
//插入非二进制数据
DB_ERR Tmysql::Insert(TDATAMAP &kv, std::string &tablename)
{
	if (kv.empty() || tablename.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_DATA;
	}
	if (!mysql)
	{
		Tprint("Insert failed:mysql is NULL");
		return DB_FAILDE;
	}
	string sql = GetInsertSql(kv, tablename);
	if (sql.empty())
		return DB_FAILDE;
	if (!Query(sql.c_str()))
		return DB_FAILDE;
	TUINT64 num = mysql_affected_rows(mysql);
	if (num <= 0)
		return DB_FAILDE;
	Tprint("return success");
	return DB_SUCCESS;
}
//插入二进制数据
DB_ERR Tmysql::InsertBin(TDATAMAP &kv, std::string &tablename)
{
	string sql = "";
	if (kv.empty() || tablename.empty() || !mysql)
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	sql = "insert into `";
	sql += tablename;
	sql += "`";
	//insert into t_video (name,size) values(?,?)
	string keys = "";
	string vals = "";
	//绑定字段
	MYSQL_BIND bind[256] = { 0 };
	int i = 0;
	//迭代map
	for (TDATAMAP::iterator ptr = kv.begin(); ptr != kv.end(); ptr++)
	{
		//字段名
		keys += "`";
		keys += ptr->first;
		keys += "`,";

		vals += "?,";
		bind[i].buffer = (char*)ptr->second.data;
		bind[i].buffer_length = ptr->second.size;
		bind[i].buffer_type = (enum_field_types)ptr->second.type;
		i++;
	}
	//去除多余的逗号
	keys[keys.size() - 1] = ' ';
	vals[vals.size() - 1] = ' ';

	sql += "(";
	sql += keys;
	sql += ")values(";
	sql += vals;
	sql += ")";
	//预处理SQL语句
	MYSQL_STMT *stmt = mysql_stmt_init(mysql);
	if (!stmt)
	{
		cerr << "mysql_stmt_init failed!" << mysql_error(mysql) << endl;
		return DB_FAILDE;
	}
	if (mysql_stmt_prepare(stmt, sql.c_str(), (unsigned long)(sql.length())) != 0)
	{
		mysql_stmt_close(stmt);
		cerr << "mysql_stmt_prepare failed!" << mysql_error(mysql) << endl;
		return DB_FAILDE;
	}

	if (mysql_stmt_bind_param(stmt, bind) != 0)
	{
		mysql_stmt_close(stmt);
		cerr << "mysql_stmt_bind_param failed!" << mysql_stmt_error(stmt) << endl;
		return DB_FAILDE;
	}
	if (mysql_stmt_execute(stmt) != 0)
	{
		mysql_stmt_close(stmt);
		cerr << "mysql_stmt_execute failed!" << mysql_stmt_error(stmt) << endl;
		return DB_FAILDE;
	}
	mysql_stmt_close(stmt);
	Tprint("return success");
	return DB_SUCCESS;
}

//获取更新数据的sql语句 where语句中,用户要包含where
std::string Tmysql::GetUpdateSql(TDATAMAP &kv, std::string &tablename, std::string &where, std::string &idnum)
{
	//update t_video set name='update001',size=1000 where id=10
	string sql = "";
	sql = "update `";
	sql += tablename;
	sql += "` set ";
	for (TDATAMAP::iterator ptr = kv.begin(); ptr != kv.end(); ptr++)
	{
		sql += "`";
		sql += ptr->first;
		sql += "`='";
		sql += ptr->second.data;
		sql += "',";
	}
	//去除多余的逗号
	sql[sql.size() - 1] = ' ';
	sql += " where ";
	sql += where;
	sql += "=";
	sql += idnum;
	return sql;
}

TUINT64 Tmysql::Update(TDATAMAP &kv, std::string &tablename, std::string &where, std::string &idnum)
{
	if (kv.empty() || tablename.empty() || where.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return -1;
	}
	if (!mysql)return -1;
	string sql = GetUpdateSql(kv, tablename, where, idnum);
	if (sql.empty())
		return -1;
	if (!Query(sql.c_str()))
	{
		return -1;
	}
	Tprint("return success");
	return mysql_affected_rows(mysql);
}

TUINT64 Tmysql::UpdateBin(TDATAMAP &kv, std::string &tablename, std::string &where, std::string &idnum)
{
	if (kv.empty() || tablename.empty() || where.empty())
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return -1;
	}
	if (!mysql || kv.empty() || tablename.empty())
	{
		return -1;
	}
	string sql = "";
	sql = "update `";
	sql += tablename;
	sql += "` set ";
	MYSQL_BIND bind[256] = { 0 };
	int i = 0;
	for (TDATAMAP::iterator ptr = kv.begin(); ptr != kv.end(); ptr++)
	{
		sql += "`";
		sql += ptr->first;
		sql += "`=?,";
		bind[i].buffer = (char*)ptr->second.data;
		bind[i].buffer_length = ptr->second.size;
		bind[i].buffer_type = (enum_field_types)ptr->second.type;
		i++;
	}
	//去除多余的逗号
	sql[sql.size() - 1] = ' ';
	sql += " where ";
	sql += where;
	sql += "=";
	sql += idnum;

	//预处理SQL语句上下文
	MYSQL_STMT *stmt = mysql_stmt_init(mysql);
	if (!stmt)
	{
		cerr << "mysql_stmt_init failed!" << mysql_error(mysql) << endl;
		return -1;
	}
	if (mysql_stmt_prepare(stmt, sql.c_str(), (unsigned long)(sql.length())) != 0)
	{
		mysql_stmt_close(stmt);
		cerr << "mysql_stmt_prepare failed!" << mysql_error(mysql) << endl;
		return -1;
	}

	if (mysql_stmt_bind_param(stmt, bind) != 0)
	{
		mysql_stmt_close(stmt);
		cerr << "mysql_stmt_bind_param failed!" << mysql_stmt_error(stmt) << endl;
		return -1;
	}
	if (mysql_stmt_execute(stmt) != 0)
	{
		mysql_stmt_close(stmt);
		cerr << "mysql_stmt_execute failed!" << mysql_stmt_error(stmt) << endl;
		return -1;
	}
	mysql_stmt_close(stmt);
	Tprint("return success");
	return mysql_stmt_affected_rows(stmt);
}


DB_ERR Tmysql::StartTransaction()
{
	return (Query("set autocommit=0")==true)?DB_SUCCESS:DB_FAILDE;
}

DB_ERR Tmysql::StopTransaction()
{
	return (Query("set autocommit=1") == true) ? DB_SUCCESS : DB_FAILDE;
}

DB_ERR Tmysql::Commit()
{
	return (Query("commit") == true) ? DB_SUCCESS : DB_FAILDE;

}
DB_ERR Tmysql::Rollback()
{
	return (Query("rollback") == true) ? DB_SUCCESS : DB_FAILDE;
}
//简易接口,返回select的数据结果,每次调用清理上一次的结果集
DB_ERR Tmysql::EasySelect(std::string &tablename, TROWS &rows)
{
	if (tablename.empty() || !(&rows))
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	string sql = "select * from " + tablename;
	FreeResult();
	if (!Query(sql.c_str()))
		return DB_FAILDE;
	if (StoreResult() != DB_SUCCESS)
		return DB_FAILDE;
	for (;;)
	{
		auto row = FetchRow();
		if (row.empty())break;
		rows.push_back(row);
	}
	Tprint("return success");
	return DB_SUCCESS;
}

DB_ERR Tmysql::EasyLike(std::string &tablename, std::string &fieldname, std::string &fielddata, TROWS &rows)
{
	if (tablename.empty() || fieldname.empty() || fielddata.empty() || !(&rows))
	{
		Tprint("return %s", g_errstring[DB_INVALID_PARAM]);
		return DB_INVALID_PARAM;
	}
	FreeResult();
	string sql = "select * from " + tablename + " where " + fieldname + " like '%" + fielddata + "%'";
	if (!Query(sql.c_str()))
		return DB_FAILDE;
	if (StoreResult() != DB_SUCCESS)
		return DB_FAILDE;
	for (;;)
	{
		auto row = FetchRow();
		if (row.empty())break;
		rows.push_back(row);
	}
	Tprint("return success");
	return DB_SUCCESS;
}
使用C++代码封装的win32操作类, 与MFC相似,对于学习SDKC++是巨好的参考 Tutorials Menu of tutorials Tutorial 1: The Simplest Window Tutorial 2: Using Classes and Inheritance Tutorial 3: Using Messages to Create a Scribble Window Tutorial 4: Repainting the Window Tutorial 5: Wrapping a Frame around our Scribble Window Tutorial 6: Customising Window Creation Tutorial 7: Customising the Toolbar Tutorial 8: Loading and Saving Files Tutorial 9: Printing Tutorial 10: Finishing Touches Tutorial 1: The Simplest Window The following code uses Win32++ to create a window. This is all the code you need (in combination with Win32++) to create and display a simple window. Note that in order to add the Win32++ code to our program, we use an #include statement as shown below. #include "../Win32++/Wincore.h" INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { //Start Win32++ CWinApp MyApp; //Create a CWnd object CWnd MyWindow; //Create (and display) the window MyWindow.Create(); //Run the application return MyApp.Run(); } This program has four key steps: Start Win32++. We do this here by creating a CWinApp object called MyApp. Create a CWnd object called MyWindow. Create a default window by calling the Create function. Start the message loop, by calling the Run function. If you compile and run this program, you'll find that the application doesn't end when the window is closed. This is behaviour is normal. An illustration of how to use messages to control the windows behaviour (including closing the application) will be left until tutorial 3.
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值