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

            評論

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

            狠狠色噜噜色狠狠狠综合久久| 久久久久久久久久久免费精品 | 综合网日日天干夜夜久久| 大美女久久久久久j久久| 99久久精品国产一区二区蜜芽| 久久精品一区二区| 91久久福利国产成人精品| www亚洲欲色成人久久精品| 99久久精品国产一区二区| 欧美粉嫩小泬久久久久久久 | 综合人妻久久一区二区精品| 久久精品青青草原伊人| 亚洲色婷婷综合久久| 久久精品人成免费| 国产99久久久国产精免费| 四虎久久影院| 久久精品黄AA片一区二区三区| 99999久久久久久亚洲| 久久99精品久久久久久秒播| 午夜精品久久久久久| 亚洲精品乱码久久久久久蜜桃不卡| 久久中文骚妇内射| 久久精品国产99久久香蕉| 亚洲中文字幕久久精品无码APP | 久久这里的只有是精品23| 久久亚洲AV成人出白浆无码国产 | 国产—久久香蕉国产线看观看| 手机看片久久高清国产日韩| 久久久久亚洲AV片无码下载蜜桃| 国产成人无码精品久久久免费| 伊人久久一区二区三区无码| 国产亚洲色婷婷久久99精品| 久久伊人色| 久久免费高清视频| 国内精品伊人久久久久妇| 狠狠色婷婷综合天天久久丁香| 三级片免费观看久久| 91亚洲国产成人久久精品| 性高湖久久久久久久久| 无夜精品久久久久久| 国产毛片久久久久久国产毛片 |