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

来源:互联网 发布:2016淘宝双十一数据 编辑:程序博客网 时间:2024/06/01 12:55
 学习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
}



原创粉丝点击