Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,长修远,我们不能没有钱
随笔 - 172, 文章 - 0, 评论 - 257, 引用 - 0
数据加载中……

[导入]libsdb字段名的解决方案。自己分析sql语句中的select 字段名,自己维护

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

posted on 2006-01-12 09:56 Khan 阅读(537) 评论(1)  编辑 收藏 引用 所属分类: GCC/G++

评论

# re: [导入]libsdb字段名的解决方案。自己分析sql语句中的select 字段名,自己维护  回复  更多评论   

vim的代码着色真是一流,呵呵
windows 下面也有GVim ,还可以生成 HTML
2006-01-27 13:45 | 思春贴调查员(Khan)

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理