天天看點

MFC單文檔使用ADO清單控件連接配接資料庫

因為以前沒有考慮到程式要連接配接資料庫,是以在建立程式時選擇了不支援資料庫,現在突然要加資料庫,還是蠻麻煩的,看了兩天相關的文章,終于搞定了,希望能幫助和我遇到同樣問題的朋友。

建立MFC單文檔,在菜單欄中,添加指令,用于連接配接對話框,在資源中添加對話框,并建立對話框類,詳細方法看相關資料。

這裡建立的對話框類為cliebiaotrldlg,在對話框中添加一個清單控件,添加一個顯示按鈕。右鍵添加控件變量CListCtrl m_List,右鍵檢視清單控件的屬性,在樣式中檢視下拉菜單中選擇report。

添加變量_ConnectionPtr , _RecordsetPtr

class cliebiaotrldlg : public CDialog

{

// Construction

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

public:

cliebiaotrldlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data

//{{AFX_DATA(cliebiaotrldlg)

enum { IDD = IDD_DIALOG2 };

CListCtrl m_List;

}

初始化:初始化清單控件及ADO

BOOL cliebiaotrldlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: Add extra initialization here

LVCOLUMN column;

column.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;

column.fmt=LVCFMT_LEFT;    //左對齊

column.cx=70;                   //寬度

column.iSubItem=0;              //第一列

column.pszText="ID";          //标題

m_List.InsertColumn(0,&column);//設定第一列

column.iSubItem=1;

column.pszText="NAME";

m_List.InsertColumn(1,&column);//設定第二列

column.iSubItem=2;

column.pszText="MONEY";

m_List.InsertColumn(2,&column);//設定第三列

::CoInitialize(NULL);

return TRUE; // return TRUE unless you set the focus to a control

   // EXCEPTION: OCX Property Pages should return FALSE

}

顯示程式:

m_pConnection.CreateInstance(_uuidof(Connection)); //初始化Connection指針

m_pRecordset.CreateInstance(_uuidof(Recordset));//初始化Recordset指針

_variant_t var;

CString strName,strAge;

    try

    {

   m_pConnection->Open("DSN=ADOTest","","",0); //連接配接叫作ADOTest的ODBC資料源

   //注意:這是連接配接不需要使用者ID或密碼的open 函數

   CString strSql="select * from middle";

   BSTR bstrSQL = strSql.AllocSysString();

   m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);

   int i=0;

   while(!m_pRecordset->adoEOF)//周遊所有記錄

   {    

     m_List.InsertItem(i,"");//隻有加上這一步才能将資料添加進去

     m_List.SetItemText(i,0,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("id"));

     m_List.SetItemText(i,1,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("name"));

     m_List.SetItemText(i,2,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("money"));

     i++;

    }

    m_pRecordset->MoveNext();//轉到下一條紀錄

   }

    }

    catch (CMemoryException* e)

    {

    }

參考文章:

http://apps.hi.baidu.com/share/detail/17239441

http://zhidao.baidu.com/question/126535852.html?fr=ala0