• <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>

            hdqqq

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              35 隨筆 :: 0 文章 :: 104 評論 :: 0 Trackbacks
            ?????? 上一篇講到了根據一個typelist實現一個結構,這個結構帶有typelist中所有類型的成員,同時,可以通過Field0,Field1等接口訪問和賦值.在這個基礎上,我們可以構建對應一條記錄的結構data_row,

            二.一條記錄

            #define?ROW_NO_CHANGE?0
            #define?ROW_ADD?
            1
            #define?ROW_UPDATE?
            2
            #define?ROW_DELETE?
            3

            template
            <typename?_tlist>
            class?data_op_record_row?:?
            public?struct_mem<_tlist>
            {
            public:
            ????enum?_enum_RowState?{
            ????????_en_Row_NoChange?
            =?ROW_NO_CHANGE,????//未修改
            ????????_en_Row_Add?
            =?ROW_ADD,????????????//新增記錄
            ????????_en_Row_Update?
            =?ROW_UPDATE,????????//更新
            ????????_en_Row_Del?
            =?ROW_DELETE,????????//刪除
            ????}?m_en_State;
            public:
            ????void?SetState(
            int?newstate)?{
            ????????
            if?(m_en_State?!=?newstate)?{
            ????????????
            if?(newstate?==?_en_Row_NoChange?||?
            ????????????????newstate?
            ==?_en_Row_Add?||?
            ????????????????newstate?
            ==?_en_Row_Update?||?
            ????????????????newstate?
            ==?_en_Row_Del)?
            ????????????{
            ????????????????m_en_State?
            =?(_enum_RowState)newstate;
            ????????????}
            ????????}
            ????}
            public:
            ????data_op_record_row?()?:?m_en_State(_en_Row_NoChange)?{}
            ????~data_op_record_row?(){}
            protected:
            private:
            };
            上面的類增加了一個枚舉,標識這條記錄當前的狀態,在記錄集中,將根據記錄的狀態進行相關的操作.這個其實類似與.net中的DataRow,不過.net中的DataRow可以用wizzard生成需要的類,而這里是用模板生成的.

            三.數據類型轉換
            ????? 數據庫中的表對應的字段有不同的數據類型,ADO操作接口中用不同的數據類型與之對應,其中Field接口的GetType就是返回字段類型的,但是ADO的GetValue返回的是_variant_t類型,為了實際業務的需要,還需要轉換成不同的類型,因此,需要對_variant_t類型進行轉換.為此需要提供模板轉換函數

            template?<typename?_type>
            void?DbData_Change(_type
            &?ret,?_variant_t&?field)
            {
            ???AfxMessageBox(
            "未定義的數據轉換");
            }


            template?
            <>
            void?DbData_Change
            <int>(int?&?ret,?_variant_t&?field)
            {
            ????ret?
            =?field.lVal;
            }

            template?
            <>
            void?DbData_Change
            <std::string>(std::string&?ret,?_variant_t&?field)
            {
            ????_bstr_t?temp;

            ????
            if?(field.vt?!=?VT_NULL)?{
            ????????temp?
            =?field.bstrVal;
            ????????ret?
            =?temp.operator?const?char*();
            ????}
            }

            template?
            <>
            void?DbData_Change
            <bool>(bool&?ret,?_variant_t&?field)
            {
            ????ret?
            =?(field.boolVal?==?(short)0xFFFF???TRUE?:?FALSE);
            }

            template?
            <>
            void?DbData_Change
            <double>(double&?ret,?_variant_t&?field)
            {
            ????
            if?(field.vt?!=?VT_NULL)?{
            ????????
            //ret?=?field.cyVal;
            ????????ret?
            =?field.dblVal;
            ????}
            else?{
            ????????ret?
            =?0;
            ????}
            }

            上面的模板函數的功能是從_variant_t轉換到某中數據類型,對于其它類型還可以進行擴充,對于沒有進行特化的函數,編譯器會使用缺省模板,在運行時候就會出現提示.有了上面的函數,現在我們需要一個數據類型的封裝類,使得被封裝的類型可以自動進行從_variant_t類型的需要類型的轉換,所以有了下面的封裝類.
            //數據庫數據類型封裝
            template?
            <typename?_type>
            class?_db_data_wrapper
            {
            public:
            ????_type
            &?Value()?{
            ????????return?m_Data;
            ????}

            ????
            const?_type&?operator?=(const?_type&?value)?{
            ????????m_Data?
            =?value;
            ????????return?value;
            ????}

            ????_db_data_wrapper
            &?operator?=?(const?_db_data_wrapper&?other)?{
            ????????
            if?(this?!=?&other)?{
            ????????????m_Data?
            =?other.m_Data;
            ????????}
            ????????return?
            *this;
            ????}

            public:
            ????virtual?void?GetDbValue(_variant_t
            &?field_value)?{
            ????????DbData_Change(m_Data,?field_value);
            ????}

            public:
            ????_db_data_wrapper(){}
            ????_db_data_wrapper(
            const?_type&?value)?:?m_Data(value)?{}
            ????~_db_data_wrapper(){}
            private:
            ????_type?m_Data;
            };

            typedef?_db_data_wrapper
            <?int?>?DB_INT;
            typedef?_db_data_wrapper
            <?std::string?>?DB_STRING;
            typedef?_db_data_wrapper
            <?bool?>?DB_BOOL;
            typedef?_db_data_wrapper
            <?double?>?DB_DOUBLE;



            上面的代碼預定義了幾種常用的數據類型,這個數據的封裝類支持 = 操作符,因此可以直接用被封裝的數據對其賦值.象下面
            int?i?=?4;
            DB_INT?di;
            di?
            =?i;
            i?
            =?di.Value();


            同時通過成員函數GetDbValue(_variant_t& field_value), 支持從_variant_t轉換為自身封裝的類型.

            現在,可以用上面的數據類型構建記錄結構了

            typedef data_op_record_row< TYPELIST_2(DB_INT,DB_STRING) > my_DataRow;

            在上面的my_DataRow類型中,有兩個成員Field0, Field1,類型分別為 DB_INT,DB_STRING, 支持_variant_t類型轉換.

            當然,用wrapper對數據進行封裝在實際的使用中畢竟有些麻煩, 如數據必須通過 Value() 函數來取得,如果直接使用象 int, std::string 等類型作為 記錄結構的成員,也可以實現_variant自動轉換,但是需要在上一層的記錄集類中加入相關的轉換操作,實現起來比較麻煩,所以我這里選擇了對數據進行封裝.


            ?

            posted on 2007-01-22 17:33 hdqqq 閱讀(1240) 評論(1)  編輯 收藏 引用 所屬分類: c/c++

            評論

            # re: 創建一個基于模板的數據庫記錄集操作類(二) 2007-01-24 09:44 天下無雙
            看到模板,我就有些不明白了。  回復  更多評論
              

            久久伊人精品青青草原高清| 久久精品国产WWW456C0M| 五月丁香综合激情六月久久| 狠狠色丁香久久婷婷综合五月| 久久91精品国产91久久户| 久久久久亚洲爆乳少妇无 | 国产A级毛片久久久精品毛片| 亚洲精品国产综合久久一线| 久久午夜伦鲁片免费无码| 7国产欧美日韩综合天堂中文久久久久 | a级毛片无码兔费真人久久 | 久久香蕉一级毛片| 久久亚洲精品国产精品婷婷| 99久久99久久久精品齐齐| 久久人人爽人人人人爽AV| 99久久国产综合精品麻豆| 国产精品一区二区久久精品涩爱 | 97久久精品人人做人人爽| 久久久久亚洲AV无码专区首JN| 热久久这里只有精品| 无码精品久久久久久人妻中字| 欧美粉嫩小泬久久久久久久| 久久久精品国产sm调教网站| 2021国产精品午夜久久| 久久久久97国产精华液好用吗| 狠色狠色狠狠色综合久久| 久久狠狠爱亚洲综合影院 | 国产亚洲美女精品久久久久狼| 久久人做人爽一区二区三区 | 国内精品久久久久影院日本| 伊人久久大香线蕉综合5g| 国产精品午夜久久| 久久ZYZ资源站无码中文动漫| 久久人人爽人人人人爽AV | yellow中文字幕久久网| 99久久国产热无码精品免费| 青草国产精品久久久久久| 亚洲综合伊人久久综合| 久久人妻无码中文字幕| 亚洲女久久久噜噜噜熟女| 久久久久亚洲AV成人网人人网站|