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

            MyMSDN

            MyMSDN記錄開發(fā)新知道

            CListCtrl(List Control)綁定ODBC數據庫的方法。(附加:CRecordset::Open()與CRecordset::OpenEx()區(qū)別之真實體驗~)

            今天懷著虞城的心來探索打印CListCtrl的方法,可惜忙到現在被老掉牙的數據加載給絆倒。但是從中卻學到了不少新東西,以前沒有遇到過的。現在就寫出來和大家分享。
            ODBC數據源與CListCtrl的連接已經算是老生常談的事情了。
            1、先建立數據庫(這里以一個PrintTest為數據源名來處理,該數據庫包含一張表info,里面有四個字段,ID,NAME,GROUP,AGE,只是測試用因此隨便列出幾個字段,其中ID為數字類型,其余為文本,采用Access數據庫來建立。方法就是添加一張表,然后分別對表中填充一些數據,這里就不再講述!)
            2、ODBC數據源與程序的連接
            ???a.在stdafx.h文件的尾部添加#include "afxdb.h"
            ???b.針對于整個工程的全局函數CDatabase db;
            ???c.在APP文件的初始化進程中添加打開數據庫的語句
            ?????????

            ????CWinApp::InitInstance();???? // 此句為系統自動生成的;

            ????
            if ?( ! db.IsOpen())
            ????????db.Open(
            " PrintTest; " );
            ????
            else
            ????????AfxMessageBox(
            " 數據庫連接失敗! " );

            ????AfxEnableControlContainer();????
            // 此句為系統自動生成的;

            至此,與數據庫的連接基本上完成了,也正是因為這個db.Open("PrintTest;");才有了這篇文章。
            3、向記錄集(CRecordset)填充數據,在這里我們必須要談到(數據庫和記錄集對象之間的)記錄字段交換 (RFX)。(大家可以在MSDN中查閱相關信息。)現在只將步驟做一個簡述:
            ???a.在“類視圖”中添加類,然后選擇“MFC ODBC 使用者”;
            ???b.在向導中,數據源按鈕后選擇“機器數據源”選擇我們設置的ODBC數據源,這里為PrintTest;確定;
            ???c.在彈出的對話框中選擇info表,確定;
            ???d.修改類名,文件名(如果有必要的話),這里改為CInfoRS,InfoRS.h,InfoRS.cpp
            ???e.注意下面的選擇是“動態(tài)集”,確定。(警告關閉)
            這時候你可以在類向導中看到添加的新類,CInfoRS
            4、在初始化對話框的時候進行數據的讀入。
            值得注意的是:我們剛才定義的是全局的變量,但是定義的語句是在APP文件中寫入的,因此在Dlg文件中調用的時候我們仍然需要去聲明一下它是全局變量,也就是對Dlg來說,它是在外部已經定義過的變量。因此在Dlg.cpp的開頭我們補充extern CDatabase db;
            在BOOL CPrintListCtrlDlg::OnInitDialog()中添加

            ???? // ?TODO:?在此添加額外的初始化代碼 // 注意找到該函數中的這句話,在其后添加以下代碼
            ????m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);?????? // 設置ListCtrl的風格
            ???? int ?nWidth = 110 ;
            ????m_cList.InsertColumn(
            0 , " 會員編號 " ,LVCFMT_LEFT,nWidth * 2 / 3 );
            ????m_cList.InsertColumn(
            1 , " 會員姓名 " ,LVCFMT_LEFT,nWidth);
            ????m_cList.InsertColumn(
            2 , " 會員組織 " ,LVCFMT_LEFT,nWidth * 3 / 2 );
            ????m_cList.InsertColumn(
            3 , " 年齡 " ,LVCFMT_LEFT,nWidth / 2 );
            ????CInfoRS?rs(
            & db);

            ????UpdateList(rs);


            在這個應用程序中同樣要注意到,因為我們需要的是一張類似Access表的表格,而不是類似我的電腦的圖標形式的風格,因此我們需要在添加的ListControl的時候,將其屬性中的View設置為Report。

            ?UpdateList(rs);是我們自己添加的一個函數,再此我再介紹一下使用類向導添加函數的方法。
            在類視圖中,右鍵,添加->添加函數,然后添加相關參數,比如返回值類型,參數類型等,記得添加參數的時候按“添加”將其添加到參數列表中。
            下面列出UpdateList的代碼:

            void ?CPrintListCtrlDlg::UpdateList(CInfoRS & ?rs)
            {
            ????
            int ?i = 0 ;
            ????CString?strID;
            ????rs.Open();
            ????m_cList.DeleteAllItems();
            ????
            while ( ! rs.IsEOF())
            ????
            {
            ????????m_cList.InsertItem(i,
            "" );
            ????????strID.Format(
            " %d " ,rs.m_ID);
            ????????m_cList.SetItemText(i,
            0 ,strID);
            ????????m_cList.SetItemText(i,
            1 ,rs.m_NAME?);
            ????????m_cList.SetItemText(i,
            2 ,rs.m_GROUP);
            ????????m_cList.SetItemText(i,
            3 ,rs.m_AGE);
            ????????rs.MoveNext();
            ????????i
            ++ ;
            ????}

            ????rs.Close();
            }
            至此這個程序基本上就編寫完成了,但是使用Ctrl+F5調試的時候出現了錯誤。錯誤具體就不再描述,只告訴解決的方法。
            1、一個是CInfoRS類中一句#error Security Issue: The connection string may contain a password
            解決方法:注釋掉
            2、類型不匹配:
            ??m_cList.SetItemText(i,1,rs.m_NAME );
            ??m_cList.SetItemText(i,2,rs.m_GROUP);
            ??m_cList.SetItemText(i,3,rs.m_AGE);
            將提示rs.m_NAME,rs.m_GROUP,rs.m_AGE不能從“CStringW”轉換為“LPCTSTR”
            解決方法:在類視圖中定位到CInfoRS,在其變量(藍色方塊后),隨便點一個進入。按以下方法修改:
            //將以下代碼:
            ????long????m_ID;
            ????CStringW????m_NAME;
            ????CStringW????m_GROUP;
            ????CStringW????m_AGE;
            //修改為:
            ????long????m_ID;
            ????CString????m_NAME;
            ????CString????m_GROUP;
            ????CString????m_AGE;
            //即將這里的CStringW替換為CString


            //其實可以注意到之前的一大段話:以下字符串類型(如果存在)反映數據庫字段(ANSI 數據類型的 CStringA 和 Unicode數據類型的 CStringW)的實際數據類型。這是為防止 ODBC 驅動程序執(zhí)行可能不必要的轉換。如果希望,可以將這些成員更改為CString 類型,ODBC 驅動程序將執(zhí)行所有必要的轉換。(注意: 必須使用 3.5 版或更高版本的 ODBC 驅動程序以同時支持 Unicode 和這些轉換)。
            至此,編譯通過。
            但是,隨后彈出錯誤:ODBC數據源不支持動態(tài)集
            修正這個問題的方法有二:
            一、在剛才添加的時候,將動態(tài)集(默認)改為快照,在這里,將不會出現錯誤。
            二、令人慶幸的是我曾經做過一個例子,里面確實是使用動態(tài)集,但并沒有出現這個錯誤,于是我找到了另一個程序,再次調試通過。于是就很是郁悶。于是用斷點調試,最終確定問題是發(fā)生在rs.Open();的位置。
            于是查找MSDN發(fā)現(For CRecordset, the default value is CRecordset::snapshot.翻譯:對于CRecordset默認值類對象,默認值是 CRecordset::snapshot,也就是快照模式),而我們所用的是動態(tài)集的模式。這里可以將rs.Open();改為rs.Open(CRecordset::forwardOnly);再次編譯就可以通過了。
            另外可以將最初的db.Open("PrintTest;");改為db.OpenEx("DSN=PrintTest;");就可以解決問題了。這其中的奧妙就不是很清楚,只能當作經驗來和大家分享一下。也希望有知道的人能夠留言告訴我。謝謝先~!


            以下將本示例的代碼以及數據庫打包供大家學習下載!
            http://www.shnenglu.com/Files/mymsdn/PrintListCtrl.rar

            附錄:
            1、編譯調試:Visual Studio.NET 2003中文版
            2、在主對話框需要添加一個ListControl的控件。(下載的代碼可能還多包括一個打印控件,但該控件的功能并未實現,只是一個預留的測試功能。大家自行練習的時候可以不添加該按鈕。)

            posted on 2006-09-18 02:07 volnet 閱讀(3743) 評論(0)  編輯 收藏 引用

            特殊功能
             
            91精品久久久久久无码| 狠狠综合久久综合中文88| 日本久久久精品中文字幕| 亚洲AV日韩AV永久无码久久| 久久综合久久性久99毛片| 国产精品欧美久久久久天天影视| 久久久久国产精品熟女影院 | 欧美日韩精品久久久久| 久久亚洲国产精品五月天婷| Xx性欧美肥妇精品久久久久久| 国产精品一区二区久久| 久久这里只有精品久久| 久久综合狠狠色综合伊人| 99精品国产在热久久| 99久久精品国产毛片| 久久久久国色AV免费观看| 无码国内精品久久人妻麻豆按摩| 色青青草原桃花久久综合| 香蕉久久夜色精品升级完成| 精品永久久福利一区二区| 久久se精品一区二区| 久久精品国产一区二区三区| 久久人人爽人人爽人人片AV高清 | 久久er国产精品免费观看8| 久久国产成人午夜AV影院| 97精品伊人久久大香线蕉| 国产综合久久久久久鬼色| 精品无码久久久久久久久久 | 国产精品久久久久久五月尺| 久久久无码精品亚洲日韩蜜臀浪潮| 国内精品久久久久久久97牛牛 | 国产精品午夜久久| 久久妇女高潮几次MBA| 久久久91精品国产一区二区三区| 久久艹国产| 久久人人爽爽爽人久久久| 91久久精品国产91性色也| 日韩av无码久久精品免费| 久久国产一片免费观看| 亚洲va国产va天堂va久久| 久久国产精品免费|