//包含三个主要的类 /* 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; }

|