• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

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

            路漫漫,長修遠,我們不能沒有錢
            隨筆 - 173, 文章 - 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 閱讀(545) 評論(1)  編輯 收藏 引用 所屬分類: GCC/G++

            評論

            # re: [導入]libsdb字段名的解決方案。自己分析sql語句中的select 字段名,自己維護  回復  更多評論   

            vim的代碼著色真是一流,呵呵
            windows 下面也有GVim ,還可以生成 HTML
            2006-01-27 13:45 | 思春貼調查員(Khan)
            久久91精品综合国产首页| 久久精品成人免费国产片小草| 久久国产高清一区二区三区| 久久综合狠狠综合久久激情 | 99久久国产热无码精品免费 | 97久久香蕉国产线看观看| 久久夜色精品国产噜噜噜亚洲AV | 国产精品成人99久久久久91gav| 91麻精品国产91久久久久| 亚洲欧美成人久久综合中文网 | 99久久精品国产一区二区三区 | 亚洲成色www久久网站夜月| 久久99国产精一区二区三区| 久久久久久无码国产精品中文字幕 | 国内精品久久久久伊人av| 久久久久亚洲AV成人网人人网站| 久久精品国产清自在天天线| 国产成人99久久亚洲综合精品| 99久久香蕉国产线看观香| 丁香久久婷婷国产午夜视频| 色婷婷综合久久久久中文一区二区| 国产69精品久久久久9999| 亚洲AV无码久久| 久久本道综合久久伊人| 99久久综合狠狠综合久久止| 中文字幕无码久久久| 国产成人精品久久亚洲高清不卡| 久久精品99久久香蕉国产色戒| 久久久网中文字幕| 91久久九九无码成人网站| 久久99久久99精品免视看动漫| 精品国产青草久久久久福利| 久久不见久久见免费影院www日本| 久久国产精品无码HDAV| 久久AV无码精品人妻糸列| 狠狠综合久久综合中文88 | 青青青国产精品国产精品久久久久 | 日本三级久久网| 91久久精品国产免费直播| www性久久久com| 精品国产乱码久久久久久郑州公司|