mfc利用ado链接access数据库

连接之后并没有自动生成一些和ado相关的类,是正常的么。。。

[http://blog.sina.com.cn/s/blog_610c1cad0100yhrr.html]

 // UserData.cpp : implementation file
//

#include "stdafx.h"
#include "LicManage.h"
#include "UserData.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CUserData dialog
#define ACCESSVERSION "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\\stb_safety.mdb"
#define INFONUM     20  // 每页20条信息

CUserData::CUserData(CWnd* pParent /*=NULL*/)
    : CDialog(CUserData::IDD, pParent)
{
    //{{AFX_DATA_INIT(CUserData)
    m_keyWord = _T("");
    //}}AFX_DATA_INIT
}


void CUserData::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CUserData)
    DDX_Control(pDX, IDC_USERINFO, m_userInfo);
    DDX_Text(pDX, IDC_KEYWORD, m_keyWord);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUserData, CDialog)
    //{{AFX_MSG_MAP(CUserData)
    ON_BN_CLICKED(IDC_REWORK, OnRework)
    ON_BN_CLICKED(IDC_DELETE, OnDelete)
    ON_BN_CLICKED(IDC_SAVE, OnSave)
    ON_WM_CLOSE()
    ON_BN_CLICKED(IDC_EXIT, OnExit)
    ON_BN_CLICKED(IDC_QUERY, OnQuery)
    ON_BN_CLICKED(IDC_ABOVEPAGE, OnAbovepage)
    ON_BN_CLICKED(IDC_NEXTPAGE, OnNextpage)
    ON_BN_CLICKED(IDC_FIRSTPAGE, OnFirstpage)
    ON_BN_CLICKED(IDC_LASTPAGE, OnLastpage)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUserData message handlers

BOOL CUserData::OnInitDialog() 
{
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here 
    DWORD styles = m_userInfo.GetExtendedStyle();
    m_userInfo.SetExtendedStyle(styles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_TRACKSELECT);
    m_userInfo.InsertColumn(0,"用户名",LVCFMT_CENTER,70,-1);
    m_userInfo.InsertColumn(1,"特征码",LVCFMT_CENTER,150,-1);
    m_userInfo.InsertColumn(2,"用户类别",LVCFMT_CENTER,90,-1);
    m_userInfo.InsertColumn(3,"申请时间",LVCFMT_CENTER,90,-1);
    m_userInfo.InsertColumn(4,"过期时间",LVCFMT_CENTER,90,-1);
    m_userInfo.InsertColumn(5,"备注",LVCFMT_CENTER,110,-1);

    m_bUpdata = FALSE;
    m_nCurPage = 1;

    if (!ConnectData())
    {
        return FALSE;
    }
    this->Loaddata();
    this->UpdataToList(m_nCurPage);
    this->ShowPage();

    CString str;
    str.Format(_T("共%d条记录") ,m_nRecordNum);
    GetDlgItem(IDC_RECORDNUM)->SetWindowText(str);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

// 显示第几页数据
void CUserData::Loaddata()
{
    HRESULT hr;
    _variant_t vUserName , vCraCode, vUserType ,vAppTime ,vOverTime ,vRemark;
    //CString id ,usertype ,cracode ,apptime ,overtime;
    int nItem, nSubItem;
    nItem = 0;
    nSubItem = 1;
    CString sql = "SELECT * FROM stb_safety";
    if (0 == m_pConn->State)
    {
        AfxMessageBox("数据库尚未连接,不能导出数据!");
        return ;
    }

    try{

        hr = m_pRecordset->Open(_variant_t(sql) , _variant_t((IDispatch *)m_pConn, true), adOpenStatic,adLockOptimistic  ,adCmdText);

    }
    catch(_com_error e) //捕捉异常
    {
        CString errormessage;
        errormessage.Format("导出数据失败!");
        AfxMessageBox(errormessage); //显示错误信息
    }
    /*   
    if (SUCCEEDED(hr))
    {
        m_pRecordset->Move(nPage * INFONUM ,_variant_t((long)adBookmarkFirst));  // 从第一条记录往下移动N条记录
    }
    else
    {
        AfxMessageBox("导出数据失败!");
        return;
    }*/
/*
    m_userInfo.DeleteAllItems();
    while (!m_pRecordset->adoEOF) {
        // 这里为什么是adoEOF而不是EOF呢?还记得rename("EOF","adoEOF")这一句吗?
        vUserName = m_pRecordset->GetCollect("UserName");   //取得第1列的值,从0开始计数,你也可以直接给出列的名称
        vUserType = m_pRecordset->GetCollect("UserType");           //取得username字段的值
        vCraCode  = m_pRecordset->GetCollect("CraCode");
        vAppTime  = m_pRecordset->GetCollect("AppTime");
        vOverTime = m_pRecordset->GetCollect("OverTime");
        vRemark   = m_pRecordset->GetCollect("remark");
        if (vUserName.vt != VT_NULL)
        {
            m_userInfo.InsertItem(nItem, (LPCTSTR)(_bstr_t)vUserName );
        }
        else
        {
            m_userInfo.InsertItem(nItem, "" );
        }
        if(vUserType.vt != VT_NULL && vCraCode.vt != VT_NULL && vCraCode.vt != VT_NULL && vAppTime.vt != VT_NULL)
        {                   
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vCraCode );
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vUserType );
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vAppTime );
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vOverTime );            
        }
        if (vRemark.vt != VT_NULL)
        {
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vRemark );
        }
        nItem++;
        nSubItem = 1;
        m_pRecordset->MoveNext(); // 移到下条记录

        if (nItem > 19) // 由界面设计,每页只显示20条信息
            break;
    }

    m_pRecordset->MoveFirst();    // 移到首条记录
    */
}

BOOL CUserData::ConnectData()
{
    HRESULT hr;
    try{
        // 创建Connection对象
        hr = m_pConn.CreateInstance("ADODB.Connection" );
        if (SUCCEEDED(hr))
        {// 连接数据库

            //m_pConn->ConnectionTimeout = 5;///设置超时时间为5秒           
            hr = m_pConn->Open(ACCESSVERSION ,"","", adModeUnknown);// adModeReadWrite); | adModeShareDenyWrite);   
            m_pRecordset.CreateInstance(__uuidof(Recordset));
            //m_pOldRecordset.CreateInstance(__uuidof(Recordset));
            //m_pCommand.CreateInstance(__uuidof(Command));
        }
    }
    catch(_com_error e) //捕捉异常
    {
        CString errormessage;
        errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
        AfxMessageBox(errormessage); //显示错误信息
        return FALSE;
    }
    return TRUE;
}

void CUserData::OnRework() 
{
    // TODO: Add your control notification handler code here
    int nResponse;
    CString sql; 
    int nSelnum = m_userInfo.GetNextItem(-1,LVNI_SELECTED);

    if ( -1 == nSelnum)
    {
        AfxMessageBox("请选择要修改的项!");
        return;
    }

    m_Amend.m_userName = m_userInfo.GetItemText(nSelnum ,0);
    m_Amend.m_craCode  = m_userInfo.GetItemText(nSelnum ,1);
    m_Amend.m_userType = m_userInfo.GetItemText(nSelnum ,2);
    m_Amend.m_appTime  = m_userInfo.GetItemText(nSelnum ,3);
    m_Amend.m_overTime = m_userInfo.GetItemText(nSelnum ,4);
    m_Amend.m_reMark   = m_userInfo.GetItemText(nSelnum ,5);

    m_Amend.m_bShow = TRUE;
    nResponse = m_Amend.DoModal();
    if (nResponse == IDOK && !m_Amend.m_userName.IsEmpty() && !m_Amend.m_reMark.IsEmpty())
    {
        /*m_bUpdata = TRUE;
        for (int i = 0 ;i < REWORKCOUT ;i++)
        {
            if (-1 == m_cracode[i])
            {
                m_cracode[i] = nSelnum;
                m_userInfo.SetItemText(nSelnum ,0 ,m_Amend.m_userName);
                m_userInfo.SetItemText(nSelnum ,5 ,m_Amend.m_reMark);
                return;
            }
            else
            {
                if (nSelnum == m_cracode[i])
                {
                    m_userInfo.SetItemText(nSelnum ,0 ,m_Amend.m_userName);
                    m_userInfo.SetItemText(nSelnum ,5 ,m_Amend.m_reMark);
                    return;
                }
            }
        }*/

        m_bUpdata = TRUE;
        m_userInfo.SetItemText(nSelnum ,0 ,m_Amend.m_userName);
        m_userInfo.SetItemText(nSelnum ,5 ,m_Amend.m_reMark);

        m_pRecordset->Move(((m_nCurPage-1) * 20) + nSelnum,_variant_t((long)adBookmarkFirst));  // 从第一条记录往下移动N条记录
        m_pRecordset->PutCollect(_variant_t("UserName") ,_variant_t((_bstr_t)m_Amend.m_userName));   // 修改名字
        m_pRecordset->PutCollect(_variant_t("Remark") ,_variant_t((_bstr_t)m_Amend.m_reMark));       // 修改备注
        /*
        sql.Format(_T("SELECT * FROM stb_safety where CraCode='%s'") ,m_Amend.m_craCode);
        m_pRecordset->Open(_variant_t(sql) , _variant_t((IDispatch *)m_pConn, true), adOpenStatic,adLockOptimistic,adCmdText);  
        if (!m_pRecordset->adoEOF)
        {
            //m_pRecordset->PutCollect(_variant_t("UserName"),_variant_t((long)45));  // 修改名字
            m_pRecordset->PutCollect(_variant_t("UserName") ,_variant_t((_bstr_t)m_Amend.m_userName));   // 修改名字
            m_pRecordset->PutCollect(_variant_t("Remark") ,_variant_t((_bstr_t)m_Amend.m_reMark));      // 修改备注
        }*/
        //m_pRecordset->Update();
        //m_pRecordset->Close();

    }
}

void CUserData::OnDelete() 
{
    // TODO: Add your control notification handler code here
    int index = 0;
    int nSelItem = -1;  
    POSITION pos = NULL;
    CString reg, sql;
    int nSelnum = m_userInfo.GetSelectedCount();
    if (!nSelnum)
    {
        AfxMessageBox("请选择要删除的行!");
        return;
    }
    reg.Format(_T("一旦删除将无法恢复,确定要删除这%d行数据吗?") ,nSelnum);
    if (IDOK == AfxMessageBox(reg ,MB_OKCANCEL))
    {       
        //m_bUpdata = TRUE;
        while(pos = m_userInfo.GetFirstSelectedItemPosition())
        {
            nSelItem = m_userInfo.GetNextSelectedItem(pos);         
            m_userInfo.DeleteItem(nSelItem);
            m_pRecordset->Move(((m_nCurPage-1) * 20) + nSelItem ,_variant_t((long)adBookmarkFirst));  // 从第一条记录往下移动N条记录
            m_pRecordset->Delete(adAffectCurrent); // 删除当前记录
        }

        if (!m_userInfo.GetItemCount() && ((m_nCurPage) == m_nTotalPage))
        {// 如果尾页被删完,则显示上一页
            if (1 != m_nCurPage)
            {// 首页除外
                m_nCurPage--;
            }           
        }
        UpdataToList(m_nCurPage);
        ShowPage();

        reg.Format(_T("共%d条记录") ,m_nRecordNum);
        GetDlgItem(IDC_RECORDNUM)->SetWindowText(reg);
    }
}

void CUserData::OnSave() 
{
    // TODO: Add your control notification handler code here

    if (m_bUpdata)
    {
        Savedata();
    }

    /*
    HRESULT hr;
    try{
        // 保存数据到数据库
        hr = m_pRecordset->Update();
        if (SUCCEEDED(hr))
        {
            AfxMessageBox("保存完毕!");
            m_bUpdata = FALSE;
        }
    }
    catch(_com_error e) //捕捉异常
    {
        CString errormessage;
        errormessage.Format("数据保存失败!\r\n错误信息:%s",e.ErrorMessage());
        AfxMessageBox(errormessage); //显示错误信息
    }*/
}

void CUserData::OnClose() 
{
    // TODO: Add your message handler code here and/or call default
    if (m_bUpdata)
    {
        if (IDOK == AfxMessageBox("数据已经被修改,是否需要保存?" ,MB_OKCANCEL))
        {
            OnSave();
            m_pRecordset->Close();
        }       
    }

    if(m_pConn->State)
    {       
        m_pConn->Close(); 
    }

    // 因为m_pRecordset被修改,如果不保存而关闭它,会出错,所以这里直接关闭m_pConn也行
    /*if(m_pConn->State)
    {
        m_pConn->Close(); 
    }
    */
    CDialog::OnClose();
}

void CUserData::OnQuery() 
{
    // TODO: Add your control notification handler code here
    int nItem = 0;
    CString Value;
    CString sql;
    CString str;
//  HRESULT hr;
    POSITION pos = NULL;
    BOOL bFind = FALSE;
    this->UpdateData(TRUE);
    if (m_bUpdata)
    {
        if (IDOK == AfxMessageBox("数据已经被修改,需要保存吗?" ,MB_OKCANCEL))
        {
            Savedata();
        }
        if (m_pRecordset->GetRecordCount()>0)
        {
            m_pRecordset->MoveFirst();
        }

        m_bUpdata = FALSE;
    }

    m_pRecordset->Close();  

    this->BuildQuerykey(m_keyWord ,sql);

    this->QueryData(sql);
    m_nCurPage = 1;
    UpdataToList(m_nCurPage);
    ShowPage();

    m_nRecordNum = m_pRecordset->GetRecordCount();
    str.Format(_T("共%d条记录") ,m_nRecordNum);
    GetDlgItem(IDC_RECORDNUM)->SetWindowText(str);
}

void CUserData::OnExit() 
{
    // TODO: Add your control notification handler code here
    OnClose();
    this->OnOK();
}

void CUserData::Savedata()
{   
    m_pRecordset->Update();
/*  CString sql;
    CString keyvalue ,username ,remark;
    int nIndex = 0;

    // 修改
    while (-1 != m_cracode[nIndex])
    {
        keyvalue = m_userInfo.GetItemText(m_cracode[nIndex] ,1);
        username = m_userInfo.GetItemText(m_cracode[nIndex] ,0);
        remark = m_userInfo.GetItemText(m_cracode[nIndex] ,5);

        sql.Format(_T("SELECT * FROM stb_safety where CraCode='%s'") ,keyvalue);
        m_pRecordset->Open(_variant_t(sql) , _variant_t((IDispatch *)m_pConn, true), adOpenStatic,adLockOptimistic,adCmdText);  
        if (!m_pRecordset->adoEOF)
        {           
            m_pRecordset->PutCollect(_variant_t("UserName") ,_variant_t((_bstr_t)username));    // 修改名字
            m_pRecordset->PutCollect(_variant_t("Remark") ,_variant_t((_bstr_t)remark));        // 修改备注         
        }
        m_pRecordset->Update();
        m_pRecordset->Close();

        m_cracode[nIndex] = -1;
        nIndex++;
    }
    */
    /*for (int i = 0 ;i < REWORKCOUT ;i++)
    {
        if (!m_cracode[i].IsEmpty())
        {
            sql.Format(_T("SELECT * FROM stb_safety where CraCode='%s'") ,m_cracode[i]);
            m_pRecordset->Open(_variant_t(sql) , _variant_t((IDispatch *)m_pConn, true), adOpenStatic,adLockOptimistic,adCmdText);  
            if (!m_pRecordset->adoEOF)
            {
                //m_pRecordset->PutCollect(_variant_t("UserName"),_variant_t((long)45));  // 修改名字
                info.psz = m_cracode[i].GetBuffer(m_cracode[i].GetLength()) ;
                if((nIndex=m_userInfo.FindItem(&info)) != -1)
                {// 这里只能按控件第一列的值进行搜索
                    value = m_userInfo.GetItemText(nIndex ,0);
                    m_pRecordset->PutCollect(_variant_t("UserName") ,_variant_t((_bstr_t)value));  // 修改名字
                    value = m_userInfo.GetItemText(nIndex ,5);
                    m_pRecordset->PutCollect(_variant_t("Remark") ,_variant_t((_bstr_t)value));     // 修改备注
                }               
            }
            m_pRecordset->Update();
            m_pRecordset->Close();
        }
    }   */
    AfxMessageBox("数据保存完毕!");
    m_bUpdata = FALSE;  
}

void CUserData::Insertdata()
{
    _variant_t tmp; 
    int nIsNew = 0;  // 是否是新加入的元素,1:是 0:否
    HRESULT hrst;
    int nResponse;
    CString sql;
    char apptime[10] = {0};

    //m_craCode.Insert(20,'\0');
 // this->ConnectData();    

    BOOL rst = this->ConnectData(); 

    sql.Format(_T("SELECT * FROM stb_safety where CraCode='%s'") ,m_craCode);
    hrst = m_pRecordset->Open(_variant_t(sql) , _variant_t((IDispatch *)m_pConn, true), adOpenStatic,adLockOptimistic  ,adCmdText);
    if(hrst < 0)   
    {
        AfxMessageBox("数据库打开失败!");
        return ;
    }

   if (!m_pRecordset->adoEOF)
    {
        //m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vCraCode );
        _variant_t colRst = m_pRecordset->GetCollect("UserName");
        if(colRst.vt == VT_NULL)
        {
            // 数据库查找失败、
            AfxMessageBox("数据记录损坏!请进入用户信息查询,删除非法的用户记录!");
            return ;
        }

        //如果字段为空 m_Amend.m_userName.Format(_T("%s") ,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("UserName"));会出现异常
    //  m_Amend.m_userName.Format(_T("%s") ,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("UserName"));
    //  tmp = m_pRecordset->GetCollect("UserName"); 

        //m_Amend.m_userName = (LPCTSTR)_bstr_t(tmp);
        //m_Amend.m_userName.Format(_T("%s") ,tmp);

    //  m_Amend.m_craCode.Format(_T("%s") ,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("CraCode"));
        /*tmp = m_pRecordset->GetCollect("CraCode");
        m_Amend.m_craCode = (LPCTSTR)(_bstr_t)tmp;

        m_Amend.m_userType.Format(m_userType);
        m_Amend.m_appTime.Format(m_appTime);
        m_Amend.m_overTime.Format(m_overTime);

        //m_Amend.m_userType.Format(_T("%s") ,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("UserType"));
        //m_Amend.m_appTime.Format(_T("%s") ,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("AppTime"));
        //m_Amend.m_overTime.Format(_T("%s") ,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("OverTime"));
        m_Amend.m_reMark.Format(_T("%s") ,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Remark"));*/
    //  tmp = m_pRecordset->GetCollect("Remark");
        //m_Amend.m_reMark.Format(_T("%s") ,tmp);
        //m_Amend.m_reMark = (LPCTSTR)_bstr_t(tmp);

    }   
    else
    {
        m_Amend.m_userName = "";
        m_Amend.m_craCode = m_craCode;
        m_Amend.m_userType = m_userType;
        m_Amend.m_appTime = m_appTime ;
        m_Amend.m_overTime = m_overTime ;
        m_Amend.m_reMark = "" ;         
        nIsNew = 1;
    }

    m_Amend.m_bShow = FALSE;
    nResponse= m_Amend.DoModal();
    if ((IDOK != nResponse))
    {//不保存新数据
        this->Closedata();  
        return;
    }
    if (nIsNew)
    {
        m_pRecordset->AddNew();  //添加新记录
    }

    m_userName = m_Amend.m_userName;
    m_remark = m_Amend.m_reMark;

    if (!m_userName.IsEmpty())
    {
        m_pRecordset->PutCollect("UserName",_variant_t((_bstr_t)m_userName));
    }

    m_pRecordset->PutCollect("CraCode",_variant_t((_bstr_t)m_craCode)); 
    m_pRecordset->PutCollect("UserType",_variant_t((_bstr_t)m_userType));   
    m_pRecordset->PutCollect("AppTime",_variant_t((_bstr_t)m_appTime)); 
    m_pRecordset->PutCollect("OverTime",_variant_t((_bstr_t)m_overTime));
    if (!m_userName.IsEmpty())
    {
        m_pRecordset->PutCollect("Remark",_variant_t((_bstr_t)m_remark));
    }   

    m_pRecordset->Update();
    this->Closedata();
}

void CUserData::Closedata()
{
    if(m_pConn->State)
    {       
        m_pRecordset->Close();
        m_pConn->Close(); 
    }
}

void CUserData::QueryData(CString sql)
{
    _variant_t vUserName , vCraCode, vUserType ,vAppTime ,vOverTime ,vRemark;
    int RecordCount = 0;
    HRESULT hr;
    int nItem = 0;
    int nSubItem = 1;

    try{
        hr = m_pRecordset->Open(_variant_t(sql) , _variant_t((IDispatch *)m_pConn, true), adOpenStatic,adLockOptimistic  ,adCmdText);
/*  
        m_userInfo.DeleteAllItems();
        RecordCount = m_pRecordset->GetRecordCount();
        while (!m_pRecordset->adoEOF) {
            // 这里为什么是adoEOF而不是EOF呢?还记得rename("EOF","adoEOF")这一句吗?
            vUserName = m_pRecordset->GetCollect("UserName");           //取得第1列的值,从0开始计数,你也可以直接给出列的名称
            vUserType = m_pRecordset->GetCollect("UserType");           //取得username字段的值
            vCraCode  = m_pRecordset->GetCollect("CraCode");
            vAppTime  = m_pRecordset->GetCollect("AppTime");
            vOverTime = m_pRecordset->GetCollect("OverTime");
            vRemark   = m_pRecordset->GetCollect("remark");
            if (vUserName.vt != VT_NULL)
            {
                m_userInfo.InsertItem(nItem, (LPCTSTR)(_bstr_t)vUserName );
            }
            else
            {
                m_userInfo.InsertItem(nItem, "" );
            }
            if(vUserType.vt != VT_NULL && vCraCode.vt != VT_NULL && vCraCode.vt != VT_NULL && vAppTime.vt != VT_NULL)
            {                   
                m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vCraCode );
                m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vUserType );
                m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vAppTime );
                m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vOverTime );            
            }
            if (vRemark.vt != VT_NULL)
            {
                m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vRemark );
            }
            nItem++;
            nSubItem = 1;
            m_pRecordset->MoveNext(); // 移到下条记录

            if (nItem > 19) // 由界面设计,每页只显示20条信息
                break;
        }*/
    }
    catch(_com_error e) //捕捉异常
    {
        CString errormessage;
        errormessage.Format("查询数据失败!\r\n错误信息:%s",e.ErrorMessage());
        AfxMessageBox(errormessage); //显示错误信息
    }

}

// 根据关键字生成SQL查询语句(要求各个字段均要搜查)
void CUserData::BuildQuerykey(CString key ,CString &sql)
{
    int buflen = 0;
    char buf[256] = "SELECT * FROM stb_safety where UserName like '%";  // 字段UserName
    buflen = strlen(buf);
    sprintf(buf + buflen ,"%s" ,key);
    buflen = strlen(buf);
    memcpy(buf + buflen ,"%'" ,2);

    strcat(buf ," OR CraCode like '%"); // 字段CraCode
    buflen = strlen(buf);
    sprintf(buf + buflen ,"%s" ,key);
    buflen = strlen(buf);
    memcpy(buf + buflen ,"%'" ,2);

    strcat(buf ," OR UserType like '%");    // 字段UserType
    buflen = strlen(buf);
    sprintf(buf + buflen ,"%s" ,key);
    buflen = strlen(buf);
    memcpy(buf + buflen ,"%'" ,2);

    strcat(buf ," OR AppTime like '%"); // 字段AppTime
    buflen = strlen(buf);
    sprintf(buf + buflen ,"%s" ,key);
    buflen = strlen(buf);
    memcpy(buf + buflen ,"%'" ,2);

    strcat(buf ," OR OverTime like '%");    // 字段OverTime
    buflen = strlen(buf);
    sprintf(buf + buflen ,"%s" ,key);
    buflen = strlen(buf);
    memcpy(buf + buflen ,"%'" ,2);

    strcat(buf ," OR Remark like '%");  // 字段Remark
    buflen = strlen(buf);
    sprintf(buf + buflen ,"%s" ,key);
    buflen = strlen(buf);
    memcpy(buf + buflen ,"%'" ,2);

    sql.Format(_T("%s") ,buf);
}

// 显示某页记录
void CUserData::UpdataToList(UINT nPage)
{
    _variant_t vUserName , vCraCode, vUserType ,vAppTime ,vOverTime ,vRemark;
    int nSelItem ;
    int nItem = 0;
    int nSubItem = 1;

    if (m_pRecordset->GetRecordCount()>0)
    {
            m_pRecordset->MoveFirst(); // 移到第一条记录
    }

    nSelItem = (nPage-1) * 20;  

    if (m_pRecordset->adoEOF)
    {// 记录被完全删除
        return;
    }
    m_pRecordset->Move(nSelItem ,_variant_t((long)adBookmarkFirst));  // 从第一条记录往下移动N条记录

    m_userInfo.DeleteAllItems();
    while (!m_pRecordset->adoEOF) {
        // 这里为什么是adoEOF而不是EOF呢?还记得rename("EOF","adoEOF")这一句吗?
        vUserName = m_pRecordset->GetCollect("UserName");   //取得第1列的值,从0开始计数,你也可以直接给出列的名称
        vUserType = m_pRecordset->GetCollect("UserType");           //取得username字段的值
        vCraCode  = m_pRecordset->GetCollect("CraCode");
        vAppTime  = m_pRecordset->GetCollect("AppTime");
        vOverTime = m_pRecordset->GetCollect("OverTime");
        vRemark   = m_pRecordset->GetCollect("remark");
        if (vUserName.vt != VT_NULL)
        {
            m_userInfo.InsertItem(nItem, (LPCTSTR)(_bstr_t)vUserName );
        }
        else
        {
            m_userInfo.InsertItem(nItem, "" );
        }
        if(vUserType.vt != VT_NULL && vCraCode.vt != VT_NULL && vCraCode.vt != VT_NULL && vAppTime.vt != VT_NULL)
        {                   
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vCraCode );
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vUserType );
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vAppTime );
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vOverTime );            
        }
        if (vRemark.vt != VT_NULL)
        {
            m_userInfo.SetItemText(nItem, nSubItem++, (LPCTSTR)(_bstr_t)vRemark );
        }
        nItem++;
        nSubItem = 1;
        m_pRecordset->MoveNext(); // 移到下条记录

        if (nItem > 19) // 由界面设计,每页只显示20条信息
            break;
    }
}

// 显示记录集页数信息
void CUserData::ShowPage()
{
    CString str;
    UINT nTemp = m_nCurPage;
    m_nRecordNum = m_pRecordset->GetRecordCount();
    m_nTotalPage = m_nRecordNum/20;

    CWnd *pWnd = (CWnd *)GetDlgItem(IDC_CURPAGE);

    if (m_nRecordNum%20 || m_nRecordNum == 0)
    {
        m_nTotalPage++;
    }

    str.Format(_T("当前页:%d/%d") ,nTemp ,m_nTotalPage);
    pWnd->SetWindowText(str);
}

void CUserData::OnAbovepage() 
{
    // TODO: Add your control notification handler code here
    if (1 == m_nCurPage)
    {
        AfxMessageBox("当前已是首页!");
        return;
    }

    m_nCurPage--;
    UpdataToList(m_nCurPage);
    ShowPage();
}

void CUserData::OnNextpage() 
{
    // TODO: Add your control notification handler code here
    if ((m_nTotalPage) == m_nCurPage)
    {
        AfxMessageBox("当前已是尾页!");
        return;
    }

    m_nCurPage++;
    UpdataToList(m_nCurPage);
    ShowPage();
}

void CUserData::OnFirstpage() 
{
    // TODO: Add your control notification handler code here
    if (1 == m_nCurPage)
    {
        AfxMessageBox("当前已是首页!");
        return;
    }

    m_nCurPage = 1;
    UpdataToList(m_nCurPage);
    ShowPage();
}

void CUserData::OnLastpage() 
{
    // TODO: Add your control notification handler code here
    if ((m_nTotalPage) == m_nCurPage)
    {
        AfxMessageBox("当前已是尾页!");
        return;
    }

    m_nCurPage = m_nTotalPage;
    UpdataToList(m_nCurPage);
    ShowPage();
}