//包含三个主要的类
/*
1. K_Database 数据库
2. k_Record 单条记录
3. k_RecordSet 记录集合
3. k_Field 字段信息
K_mysql.h
*/
#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 ();
for(int 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 端口号
6 uinx 嵌套字
7 client_flag 客户连接参数
返回值: 0成功 -1 失败
*/
int Connect(string host, string user, string passwd, string db, unsigned int port, unsigned long client_flag)
{
if ( (myData = mysql_init((MYSQL*) 0)) && 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;
};
//-----------------------------------------------------------------------
/*
主要功能:重新启动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 ;//查询执行失败;
};
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// debug_corp.cpp : 定义控制台应用程序的入口点。
//
#include "k_mysql.h"
int main(int argc, char* argv[])
{
//------------------------------------------------------------------------
K_Database a;
int i;
// -----------------------------------------------------------------
printf("以下做第一项测试 --数据库连接-- \n");
i=a.Connect("localhost","root","","kkk",3306,0);
if(i!=0)
{
printf("数据库连接失败\n");
return 0;
}
else
{
printf("已经成功连接到制定的数据库\n");
}
K_recordSet sa;
a.ExecQueryGetRecord("select * from fgdf",sa);
for(i=0;i<sa.GetRecordCount();i++)
{
for(int j=0;j<sa.GetFieldNum();j++)
{
printf("%s\t",sa[i][j].c_str ());
}
printf("\n");
}
k_sqlfactory ss;
ss.tablename ="fgdf";
ss.where ="1";
ss.add_value ("gf","fsdfffffs");
ss.add_value ("gdf","2004-4-5");
printf("%s",ss.get_add ().c_str ());
printf("\n%s",ss.get_edit ().c_str ());
a.ExecQuery (ss.get_add ());
a.ExecQuery (ss.get_edit ());
//---------------------------------------------------------------
a.DisConnect ();
//---------------------------------------------------------------------------
return 0;
}