这个不是一个很好的解决方案,浪费了很多内存空间,我觉得比较好的,方案应该是2个vector
一个用来存放一条记录或字段名,另一个存放这个vector
/**dbm.hpp
* 数据库操作的模块,本系统中所有的数据库操作都集成于本模块
* */
#include <string>
#include <map>
#include <vector>
#include "common.h"
#include "sdb.h"
using namespace std;
typedef map<string, string> TRecord;
typedef vector<string> Tcols;
typedef vector<TRecord> TDataSet;
typedef TRecord::iterator TDataSetIter;
typedef TRecord::value_type TValueType;
/* 本类不会主动关闭数据库连接*/
class TDB_Action{
private:
char* db; //数据库连接
TDataSet dataset; //结果集
TDataSet *pd; //指向结果集的指针
static Tcols record_cols; //字段元素
/*回调函数
*@param int n 字段个数
*@param char **p 结果集
*@param void * data 数据的出口
*/
static int DB_record_callback(int n, char **p, void *data){
if (!n) return 0;
TRecord record;
record.clear();
for(int i = 0; i < n; i++){
record.insert(TValueType( record_cols[i], p[i]));
//printf("%s %s \t" , record_cols[i].c_str() ,p[i]);//
} //printf("\n" );//
((TDataSet *)data)->push_back(record);
}
public:
/*构造器*/
TDB_Action(char* the_db){
db=the_db;
pd=&dataset;
}
/*析构器*/
~TDB_Action(){};
/* 执行无结果集的sql语句
* @param char *sqlstr sql语句
*/
int DB_Excute( char *sqlstr);
/*执行有结果集的sql语句
* @param Tcols 一个vector,存储多个字段
* @param string table_name 表名
* @param const condstion where条件
* @return TDataSet 一个结果集*/
TDataSet DB_GetRecord(Tcols the_cols, string table_name, const string condtion);
};
/*dbm.cpp*/
#include "dbm.hpp"
Tcols TDB_Action::record_cols; //类静态成员变量需要在cpp中再申明一次,刚刚才知道d
/*
* */
int TDB_Action::DB_Excute( char *sqlstr) {
if (-1 == sdb_query(db, sqlstr, NULL, NULL)) {
fprintf(stderr, "Error in Execute sql statement <%s>\n", sqlstr);
return -1;
}
return 1;
}
TDataSet TDB_Action::DB_GetRecord(Tcols the_cols, string table_name, const string condtion){
for(int i=0; i<dataset.size(); i++){
dataset[i].clear();
}
dataset.clear();
record_cols.clear();
if (the_cols.size()<=0)
return dataset;//如果没有字段,直接返回
char sqlstr[400] ;
memset(sqlstr, '0', sizeof(sqlstr));
string tmp(""); //构建一个sql语句
for (int i =0; i < the_cols.size() ; i++ ){
record_cols.push_back( the_cols[i].c_str());
if( the_cols[i] == "*" )
return dataset; //不能包含*
if( i < the_cols.size() -1)
tmp = tmp + the_cols[i] + ", ";
else
tmp = tmp + the_cols[i] ;
}
tmp = "Select " + tmp + " From " + table_name + condtion;
sprintf(sqlstr, tmp.c_str());
if (-1 == sdb_query(db, sqlstr, DB_record_callback, pd)) {
fprintf(stderr, "Error in Query sql statement <%s>\n", sqlstr);
return dataset;
}
return dataset;
}
int main(){//测试代码
char *db = NULL;
char url[1024]="mysql:host=127.0.0.1:db=smscgw:uid=root";
db=sdb_open(url);
if (db == NULL) {
fprintf(stderr, "Open database fault <%s>\n", url);
exit (-1);
}
TDB_Action dba(db);
Tcols te; string strs[5] = {"acttime","seq_num","msg","connname","mtmsg"};
te.push_back(strs[0]);
te.push_back(strs[1]);
te.push_back(strs[2]);
te.push_back(strs[3]);
const string aaa(" ORDER BY acttime ");
//取结果集
TDataSet temp= dba.DB_GetRecord(te, strs[4],aaa);
printf("打印结果集\n");
for(int i=0 ; i < temp.size(); i++){
for(TDataSetIter it=temp[i].begin();it != temp[i].end(); it++){
printf("key:%s :%s \t", it->first.c_str(), it->second.c_str());
}
printf("\n");
}
if ( db!= NULL)
sdb_close(db);
return 0;
}