• <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)
            欧美国产精品久久高清| 国产精品久久久久久一区二区三区 | 国产毛片欧美毛片久久久| 久久精品中文无码资源站| 精品国产一区二区三区久久久狼| 99久久99久久久精品齐齐| 久久久久亚洲AV成人网人人软件| 久久久久久伊人高潮影院| 伊人久久大香线焦综合四虎| 亚洲国产视频久久| 国产激情久久久久影院老熟女免费 | 精品国产乱码久久久久久1区2区 | 蜜臀久久99精品久久久久久小说| 99久久综合国产精品二区| 久久精品国产精品亚洲精品 | 久久精品无码午夜福利理论片| 久久最近最新中文字幕大全 | 久久久久久一区国产精品| 久久久久久九九99精品| 99精品国产免费久久久久久下载| 日本久久久精品中文字幕| 久久久久久无码Av成人影院| 热久久最新网站获取| 久久99精品久久久久久不卡| 91精品国产综合久久久久久| 精品国产乱码久久久久软件| 狠狠色丁香久久婷婷综合_中 | 亚洲国产精品无码久久一线| 亚洲伊人久久综合影院| 久久亚洲国产成人影院网站| 亚洲综合精品香蕉久久网97 | 精品久久一区二区三区| 亚洲国产精品成人久久| 午夜不卡久久精品无码免费| 国产精品久久新婚兰兰| 久久亚洲日韩看片无码| 久久久国产视频| 久久精品国产99国产精品亚洲| 久久久久久久久66精品片| 久久久久久曰本AV免费免费| 中文字幕久久精品|