• <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 閱讀(541) 評論(1)  編輯 收藏 引用 所屬分類: GCC/G++

            評論

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

            vim的代碼著色真是一流,呵呵
            windows 下面也有GVim ,還可以生成 HTML
            2006-01-27 13:45 | 思春貼調查員(Khan)
            亚洲va国产va天堂va久久| 久久国产成人精品麻豆| 亚洲人成无码久久电影网站| 久久久久久国产精品无码下载| 久久这里只有精品视频99| 久久久这里有精品| 韩国免费A级毛片久久| 狠狠色丁香婷婷综合久久来来去| 久久综合成人网| 国产精品9999久久久久| 久久综合成人网| 久久精品人人做人人爽电影蜜月 | 精品久久久久久无码免费| 久久国产精品久久| 中文字幕无码久久久| 狠狠干狠狠久久| 欧美久久久久久| 中文字幕亚洲综合久久2| 精品无码久久久久国产动漫3d| 国产精品久久久久天天影视| 日韩电影久久久被窝网| 久久精品人人做人人妻人人玩| 精品熟女少妇aⅴ免费久久| 日韩精品无码久久久久久| 亚洲а∨天堂久久精品9966| 91精品国产乱码久久久久久| 亚洲人成网亚洲欧洲无码久久| 国内精品久久久久久久coent| 久久青青草原亚洲av无码app| 久久久久久噜噜精品免费直播| 精品久久久久久中文字幕| 国产V综合V亚洲欧美久久| 99精品国产99久久久久久97| 久久久久久极精品久久久| 国产精品九九久久免费视频| 久久九九有精品国产23百花影院| 亚洲成色WWW久久网站| 亚洲人成精品久久久久| 少妇精品久久久一区二区三区| 午夜精品久久久久久影视777| 色婷婷久久久SWAG精品|