這個不是一個很好的解決方案,浪費了很多內存空間,我覺得比較好的,方案應該是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;
}