这个不是一个很好的解决方案,浪费了很多内存空间,我觉得比较好的,方案应该是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;
 }