#include "Mysql_Query.h"
static int s_index;
Query::Query()
{
//初始化连接数据库变量
connection = mysql_init(NULL);
if(connection == NULL)
{
cout<<"mysql_init failed!"<<endl;
exit(1);
}
//设置默认编码GBK
Set_Encode();
}
Query::~Query()
{
if(NULL != connection)
{
mysql_close(connection);
connection = NULL;
}
}
bool Query::Open()
{
string encode;
/*
** MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db,
** unsigned int port, const char *unix_socket, unsigned long client_flag)
** mysql:mysql_init初始化后的MYSQL host:主机IP user:用户名 passwd:用户名密码 db:数据库名称
** port:一般为0。如果不是0,其值将用作TCP/IP连接的端口号 unix_socket:一般为NULL。如果不是NULL,该字符串描述了应使用的套接字或命名管道
** client_flag:的值通常为0
*/
if(NULL == mysql_real_connect(connection , server_hoset.c_str() , user_name.c_str() , password.c_str() , database_name.c_str() , 0 , NULL , 0))
{
string err(mysql_error(connection));
cout<<"mysql_real_connect failed!"<<endl;
cout<<err<<endl;
return false;
}
encode = "set names " + query_encode;
cout<<query_encode<<endl;
// 查询编码设定
if(mysql_query(connection, encode.c_str()))
{
string err(mysql_error(connection));
cout<<err<<endl;
return false;
}
return true;
}
void Query::Set_Server_IP(string &server_ip)
{
server_hoset = server_ip;
}
void Query::Set_Usr_Name(string &usr_name)
{
user_name = usr_name;
}
void Query::Set_Password(string &passwd)
{
password = passwd;
}
void Query::Set_DB_Name(string &db_name)
{
database_name = db_name;
}
/**
*当前连接设置默认的字符集
*encode:utf8,GBK,...
*/
void Query::Set_Encode(string encode)
{
query_encode.clear();
query_encode = encode;
/* if (!mysql_set_character_set(connection, encode.c_str()))
{
string info(mysql_character_set_name(connection));
cout<<"New client character set:"<<info<<endl;
}
*/
}
bool Query::Exec(string sql)
{
cout<<"sql:"<<sql<<endl;
if(mysql_query(connection, sql.c_str()))
{
string err(mysql_error(connection));
cout<<err<<endl;
return false;
}
//初始化逐行的结果集检索
res = mysql_use_result(connection);
if(res)
{
int j = 0;
map_values.clear();
s_index = 0;
//mysql_field_count(connection) 返回作用在连接上的最近查询的列数
//检索一个结果集合的下一行 while ((row = mysql_fetch_row(res)) != NULL)
while (NULL != (row = mysql_fetch_row(res)))
{
j++;
if(row <= 0)
{
break;
}
//mysql_num_fields(res) 函数返回结果集中字段的数
for(int i = 0 ; i < mysql_num_fields(res) ; i++)
{
if(NULL == row[i])
{
map_values[j].insert(pair<int,string>(i, "null"));
}else
{
map_values[j].insert(pair<int,string>(i, string(row[i])));
}
printf("%s\t" , row[i]);
}
printf("\n");
}
}
//释放结果集使用的内存
mysql_free_result(res);
return true;
}
/**
*数据取出后,直到下次重新查询覆盖,不然一直保存上次查询的结果
*/
bool Query::Next()
{
if(map_values.empty())
return false;
if(s_index < map_values.size())
{
s_index++;
return true;
}
return false;
}
string Query::Value(int i)
{
map<int ,string> val;
if(s_index > map_values.size())//防止出现map_values的值自动增大,当s_index > map_values.size(),Next将停不下来
return "null";
val = map_values[s_index];
if(i > map_values[s_index].size())
return "null";
return val[i];
}
/*
*开启事务传输,关闭自动提交,完了后打开自动提交,Mysql默认自动提交
*/
void Query::Translation()
{
mysql_autocommit(connection, false);//关闭自动提交
}
/*
*事务提交
*/
void Query::Commit()
{
mysql_commit(connection);
mysql_autocommit(connection, true);//开启自动提交
}
/*
*事务回滚
*/
void Query::Roll_Back()
{
mysql_rollback(connection);
mysql_autocommit(connection, true);//开启自动提交
}