您的位置:首页 > 编程语言 > C语言/C++

学习VC++深入浅出——ADO的使用

2008-03-20 00:18 162 查看
 学习VC++深入浅出——ADO的使用


_ConnectionPtr    m_pConnection;








    // 初始化COM,创建ADO连接等操作


    AfxOleInit();


    m_pConnection.CreateInstance(__uuidof(Connection));




    // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,


    // 因为它有时会经常出现一些想不到的错误。jingzhou xu


    try                 




    ...{    


        // 打开本地Access库Demo.mdb


        m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);


        


    }


    catch(_com_error e)




    ...{


        AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");


        return FALSE;


    } 






int CChatApp::ExitInstance() 




...{


    // TODO: Add your specialized code here and/or call the base class


    if(m_pConnection->State)


        m_pConnection->Close();


    m_pConnection= NULL;




    return CWinApp::ExitInstance();


}








    _ConnectionPtr    m_pConnection;


    _CommandPtr        m_pCommand;


    _RecordsetPtr    m_pRecordset;




    // TODO: Add extra initialization here




        // 使用ADO创建数据库记录集


 
1e65c
   m_pRecordset.CreateInstance(__uuidof(Recordset));




    // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,


    // 因为它有时会经常出现一些想不到的错误。jingzhou xu


    try




    ...{


        m_pRecordset->Open("SELECT * FROM DemoTable",                // 查询DemoTable表中所有字段


                            theApp.m_pConnection.GetInterfacePtr(),     // 获取库接库的IDispatch指针


                            adOpenDynamic,


                            adLockOptimistic,


                            adCmdText);


    }


    catch(_com_error *e)




    ...{


        AfxMessageBox(e->ErrorMessage());


    }


    


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


}




void CChatDlg::OnSysCommand(UINT nID, LPARAM lParam)




...{


    if ((nID & 0xFFF0) == IDM_ABOUTBOX)




    ...{


        CAboutDlg dlgAbout;


        dlgAbout.DoModal();


    }


    else




    ...{


        CDialog::OnSysCommand(nID, lParam);


    }


}




// If you add a minimize button to your dialog, you will need the code below


//  to draw the icon.  For MFC applications using the document/view model,


//  this is automatically done for you by the framework.




void CChatDlg::OnPaint() 




...{


    if (IsIconic())




    ...{


        CPaintDC dc(this); // device context for painting




        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);




        // Center icon in client rectangle


        int cxIcon = GetSystemMetrics(SM_CXICON);


        int cyIcon = GetSystemMetrics(SM_CYICON);


        CRect rect;


        GetClientRect(&rect);


        int x = (rect.Width() - cxIcon + 1) / 2;


        int y = (rect.Height() - cyIcon + 1) / 2;




        // Draw the icon


        dc.DrawIcon(x, y, m_hIcon);


    }


    else




    ...{


        CDialog::OnPaint();


    }


}




// The system calls this to obtain the cursor to display while the user drags


//  the minimized window.


HCURSOR CChatDlg::OnQueryDragIcon()




...{


    return (HCURSOR) m_hIcon;


}




void CChatDlg::OnButtonRead() 




...{


    // TODO: Add your control notification handler code here


    _variant_t var;


    CString strName,strAge;




    // 清空列表框


    m_AccessList.ResetContent();


    strName=strAge="";




    // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,


    // 因为它有时会经常出现一些想不到的错误。jingzhou xu


    try




    ...{


        if(!m_pRecordset->BOF)


            m_pRecordset->MoveFirst();


        else




        ...{


            AfxMessageBox("表内数据为空");


            return;


        }




        // 读入库中各字段并加入列表框中


        while(!m_pRecordset->adoEOF)




        ...{


            var = m_pRecordset->GetCollect("Name");


            if(var.vt != VT_NULL)


                strName = (LPCSTR)_bstr_t(var);


            var = m_pRecordset->GetCollect("Age");


            if(var.vt != VT_NULL)


                strAge = (LPCSTR)_bstr_t(var);




            m_AccessList.AddString( strName + " --> "+strAge );




            m_pRecordset->MoveNext();


        }




        // 默认列表指向第一项,同时移动记录指针并显示


        m_AccessList.SetCurSel(0);


        OnSelchangeList1();


    }


    catch(_com_error *e)




    ...{


        AfxMessageBox(e->ErrorMessage());


    }    


}




void CChatDlg::OnSelchangeList1() 




...{


    // TODO: Add your control notification handler code here


    int curSel = m_AccessList.GetCurSel();        


    _variant_t var,varIndex;




    if(curSel < 0)


        return;




    try




    ...{


        // 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针


        m_pRecordset->MoveFirst();


        m_pRecordset->Move(long(curSel));


        


        var = m_pRecordset->GetCollect("Name");


        if(var.vt != VT_NULL)


            m_Name = (LPCSTR)_bstr_t(var);


        var = m_pRecordset->GetCollect("Age");


        if(var.vt != VT_NULL)


            m_Age = (LPCSTR)_bstr_t(var);


        


        UpdateData(false);


    }


    catch(_com_error *e)




    ...{


        AfxMessageBox(e->ErrorMessage());


    }    


    


}




void CChatDlg::OnButtonInsert() 




...{


    // TODO: Add your control notification handler code here


    


        UpdateData();


    if(m_Name == "" || m_Age == "")




    ...{


        AfxMessageBox("姓名和年龄信息不能为空!");


        return;


    }




    // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,


    // 因为它有时会经常出现一些想不到的错误。jingzhou xu


    try




    ...{


        // 写入各字段值


        m_pRecordset->AddNew();


        m_pRecordset->PutCollect("Name", _variant_t(m_Name));


        m_pRecordset->PutCollect("Age", atol(m_Age));


        m_pRecordset->Update();




        AfxMessageBox("插入成功!");




        // 更新显示其库内容


        int nCurSel = m_AccessList.GetCurSel();


        OnReadAccess();


        m_AccessList.SetCurSel(nCurSel);


        // 移动记录指针到新的位置


//        OnSelchangeListaccess();


        OnSelchangeList1();


    }


    catch(_com_error *e)




    ...{


        AfxMessageBox(e->ErrorMessage());


    }




}




void CChatDlg::OnButtonModify() 




...{


    // TODO: Add your control notification handler code here


    UpdateData();        // 更新对话框数据


    if(m_AccessList.GetCount() == 0 || m_Name == "" || m_Age == "")




    ...{


        AfxMessageBox("表中记录数为空或姓名和年龄信息没有设置!");


        return;


    }


    else if(m_AccessList.GetCurSel() < 0 || m_AccessList.GetCurSel() > m_AccessList.GetCount())


        m_AccessList.SetCurSel(0);




    // 修改当前记录的字段值


    try




    ...{


        m_pRecordset->PutCollect("Name", _variant_t(m_Name));


        m_pRecordset->PutCollect("Age", atol(m_Age));


        m_pRecordset->Update();




        // 重新读入库记录更新显示


        int nCurSel = m_AccessList.GetCurSel();


        OnReadAccess();


        m_AccessList.SetCurSel(nCurSel);


        // 移动记录指针到新的位置


//        OnSelchangeListaccess();


        OnSelchangeList1();


    }


    catch(_com_error *e)




    ...{


        AfxMessageBox(e->ErrorMessage());


    }


    


}




void CChatDlg::OnButtonDelete() 




...{


    // TODO: Add your control notification handler code here


    if(m_AccessList.GetCount() == 0)


        return;


    else if(m_AccessList.GetCurSel() < 0 || m_AccessList.GetCurSel() > m_AccessList.GetCount())


        m_AccessList.SetCurSel(0);




    try




    ...{


        // 删除当前行记录


        m_pRecordset->Delete(adAffectCurrent);


        m_pRecordset->Update();




        // 删除列表中当前值


        int nCurSel = m_AccessList.GetCurSel();


        m_AccessList.DeleteString(nCurSel);


        if(nCurSel == 0 && (m_AccessList.GetCount() != 0))


            m_AccessList.SetCurSel(nCurSel);


        else if(m_AccessList.GetCount() != 0)


            m_AccessList.SetCurSel(nCurSel-1);


        


        // 移动记录指针到新的位置


//        OnSelchangeListaccess();


        OnSelchangeList1();


    }


    catch(_com_error *e)




    ...{


        AfxMessageBox(e->ErrorMessage());


    }


}




void CChatDlg::OnButtonAbout() 




...{


    // TODO: Add your control notification handler code here


    CAboutDlg dlgAbout;


    


    dlgAbout.DoModal();


}




void CChatDlg::OnReadAccess()




...{


    _variant_t var;


    CString strName,strAge;




    // 清空列表框


    m_AccessList.ResetContent();


    strName=strAge="";




    // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,


    // 因为它有时会经常出现一些想不到的错误。jingzhou xu


    try




    ...{


        if(!m_pRecordset->BOF)


            m_pRecordset->MoveFirst();


        else




        ...{


            AfxMessageBox("表内数据为空");


            return;


        }




        // 读入库中各字段并加入列表框中


        while(!m_pRecordset->adoEOF)




        ...{


            var = m_pRecordset->GetCollect("Name");


            if(var.vt != VT_NULL)


                strName = (LPCSTR)_bstr_t(var);


            var = m_pRecordset->GetCollect("Age");


            if(var.vt != VT_NULL)


                strAge = (LPCSTR)_bstr_t(var);




            m_AccessList.AddString( strName + " --> "+strAge );




            m_pRecordset->MoveNext();


        }




        // 默认列表指向第一项,同时移动记录指针并显示


        m_AccessList.SetCurSel(0);


//        OnSelchangeListaccess();


        OnSelchangeList1();


    }


    catch(_com_error *e)




    ...{


        AfxMessageBox(e->ErrorMessage());


    }




}




BOOL CAboutDlg::OnInitDialog() 




...{


    CDialog::OnInitDialog();


    


    // TODO: Add extra initialization here


    //加入EMAIL的超连接


   // m_Mail.SetURL(_T("mailto:cqzhangdali@163.com"));


    //m_Mail.SetUnderline(FALSE);    




    


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


                  // EXCEPTION: OCX Property Pages should return FALSE


}





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息