学习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创建数据库记录集
    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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值