读取数据库可以用ado来读取,有接口,显示的话用API显示就行

解决方案 »

  1.   

    以下是我实际用的,odbc连MYSQL数据bool ViewList::initlist()
    {
    // 初始化表格
    SetExtendedStyle( LVS_EX_FULLROWSELECT/* | LVS_EX_GRIDLINES*/ ); // 添加列
    LVCOLUMN column;
    column.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH;
    column.fmt = LVCFMT_CENTER;
    //column.pszText = (LPTSTR)lpszColumnHeading;
    //column.cx = nWidth; const int txtnum = 100;
    wchar_t txt[txtnum] = _T("ID"); column.pszText = txt;
    column.cx = 0;
    InsertColumn(1, &column); // ID, 列宽为0,不显示,程序用。 ::LoadString( theApp.m_hInstance, IDS_NUMBER, txt, txtnum );
    column.cx = 70;
    InsertColumn(2, &column); ::LoadString( theApp.m_hInstance, IDS_STRID, txt, txtnum );
    column.cx = 140;
    InsertColumn(3, &column); ::LoadString( theApp.m_hInstance, IDS_STRNAME, txt, txtnum );
    column.cx = 100;
    InsertColumn(4, &column); ::LoadString( theApp.m_hInstance, IDS_STRGENDER, txt, txtnum );
    column.cx = 70;
    InsertColumn(5, &column); ::LoadString( theApp.m_hInstance, IDS_BIRTHDAY, txt, txtnum );
    column.cx = 110;
    InsertColumn(6, &column); ::LoadString( theApp.m_hInstance, IDS_AGE, txt, txtnum );
    column.cx = 70;
    InsertColumn(7, &column); ::LoadString( theApp.m_hInstance, IDS_STRREGDATE, txt, txtnum );
    column.cx = 110;
    InsertColumn(8, &column); ::LoadString( theApp.m_hInstance, IDS_SCANDATE, txt, txtnum );
    column.cx = 110;
    InsertColumn(9, &column); ::LoadString( theApp.m_hInstance, IDS_IMPORTDAY, txt, txtnum );
    column.cx = 110;
    InsertColumn(10, &column); ::LoadString( theApp.m_hInstance, IDS_SCANCOUNT, txt, txtnum );
    column.cx = 80;
    InsertColumn(11, &column); ::LoadString( theApp.m_hInstance, IDS_COMPANY, txt, txtnum );
    column.cx = 180;
    InsertColumn(12, &column); ::LoadString( theApp.m_hInstance, IDS_REGNOTE, txt, txtnum );
    column.cx = 300;
    InsertColumn(13, &column); // 设置排序小图标
    CHeaderCtrl* pHdrCtrl = GetHeaderCtrl();
    pHdrCtrl->SetImageList( &m_imgSort ); // 设置排序小图标 /*// 初状态是扫描时间排降序。
    HDITEM hdi;
    pHdrCtrl->GetItem(8, &hdi); // 初状态是扫描时间排降序。
    hdi.iImage = 1;
    hdi.mask |= HDI_IMAGE;
    hdi.fmt |= HDF_IMAGE | HDF_BITMAP_ON_RIGHT;
    pHdrCtrl->SetItem( 8, &hdi );*/ return true;
    }bool ViewList::filllist( int page )
    {
    if( page < 0 )
    page = 0;
    else if( page > GetPagesCount() )
    page = m_nPagesCount; // 上一句的GetPagesCount()中更新了m_nPagesCount if( page == this->m_nPageNum )
    return true; m_nPageNum = page; DeleteAllItems();
    UpdateData(); // 先更新,表现出动态更新过程 m_pRibbonCategory->SetEditInt( ID_PAGE_NUMBER, m_nPageNum + 1 ); //!! 从基类强制转换到子类,不能使用子类的变量等,只能用方法。 Cdaquizzee2 ds;
    CString sqlstr;
    sqlstr.Format( L"WHERE 1%s%s ORDER BY %s LIMIT %i, %i;",
    m_strFilterDate,
    m_strFilterInfo,
    m_strOrderby,
    m_nCountOfPage * m_nPageNum,
    m_nCountOfPage); if( ds.Open2( sqlstr ) == FALSE )
    {
    return false;
    } if( !ds.GetRecordCount() )
    {
    ds.Close();
    return true; // 没有记录时直接返回。
    } int num = m_nCountOfPage * m_nPageNum + 1;
    ds.MoveFirst();
    for( int i = 0; !ds.IsEOF(); i++, num++ )
    {
    InsertItem( i, ds.m_ID );
    CString str, str2, str3;
    str.Format(L"%i", num);
    SetItemText( i, 1, str );
    SetItemText( i, 2, ds.m_number );
    SetItemText( i, 3, ds.m_name );
    SetItemText( i, 4, ds.m_sexstr );
    if( (ds.m_birthday.m_status != COleDateTime::valid) || (ds.m_birthday.m_dt == 0) ){
    str = _T("");
    str2 = _T("");
    }
    else
    {
    str = ds.m_birthday.Format( _T("%Y-%m-%d") );
    str2.Format( L"%i", ds.m_age);
    }
    SetItemText( i, 5, str );
    SetItemText( i, 6, str2 ); if( (ds.m_regday.m_status != COleDateTime::valid) || (ds.m_regday.m_dt == 0) )
    str = _T("");
    else
    str = ds.m_regday.Format( _T("%Y-%m-%d") );
    SetItemText( i, 7, str ); if( (ds.m_scanday.m_status != COleDateTime::valid) || (ds.m_scanday.m_dt == 0) || ds.m_scancount == 0 ) // 没有扫描次数时,不显示扫描日期。
    str = _T("");
    else
    str = ds.m_scanday.Format( _T("%Y-%m-%d") );
    SetItemText( i, 8, str ); if( (ds.m_importday.m_status != COleDateTime::valid) || (ds.m_scanday.m_dt == 0) )
    str = _T("");
    else
    str = ds.m_importday.Format( _T("%Y-%m-%d") );
    SetItemText( i, 9, str ); str.Format( L"%i", ds.m_scancount );
    SetItemText( i, 10, str );
    SetItemText( i, 11, ds.m_text1 );
    SetItemText( i, 12, ds.m_note );
    //SetItemData(i, i);
    ds.MoveNext();
    } ds.Close(); SetFocus(); // 填充完成后设置焦点。 return true;
    }
      

  2.   

    使用ADO来操作吧:1、在一个公共头文件中添加ADO类支持(一般放在stdafx.h中)#import "c:\program files\common files\system\ado\msado15.dll" rename ("EOF", "adoEOF")
    using namespace ADODB;
    2、com库初始化
    在应用程序初始化函数中调用AfxOleInit()或CoInitialize(NULL)函数初始化com
    在应用程序退出函数中调用CoUnInitialize()卸载com3、数据库连接(以Oracle为例)_ConnectionPtr m_pConnection(NULL);
    _RecordsetPtr m_pRecordset(NULL);
    m_pConnection.CreateInstance(__uuidof(Connection));
    m_pRecordset.CreateInstance(__uuidof(Recordset));TCHAR szConnect[256] = {0};
    try                 
    {
    wsprintf(szConnect,_T("Provider=MSDAORA;Data Source=dbxxx;Password=xxxxx;User ID=xxxx;"));//本地数据库
    _bstr_t strConnect(szConnect);
    m_pConnection->Open(strConnect,_T(""),_T(""),adOpenUnspecified);
    }catch(_com_error e)
    {
    AfxMessageBox(e.ErrorMessage());
    return FALSE;
    }CString strSql = _T("select * from person_info");
    BSTR bstrSql = strSql.AllocSysString();
    m_pRecordset->Open(bstrSql,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);//插入表头
    TCHAR szTitle[16][16] = {0};   //保存表头标题,实际应用中应动态生成
    FieldsPtr pFields = m_pRecordset->Fields;
    long nColCount(0);
    pFields->get_Count(&nColCount);
    FieldPtr fd(NULL);
    _bstr_t bstrName;
    for(long i=0;i<nColCount;++i)

    FieldPtr pField=pFields->Item[i];
    bstrName=pField->GetName();
    lstrcpy(szTile[i],(LPCTSTR)bstrName);
    m_list.InsertColumn(i,szTile[i],LVCFMT_CENTER,100);
    }//插入数据
    _variant_t var;
    long i(0), j(0);
    CString strBuf;
    while(!m_pRecordset->adoEOF)
    {
    j = 0;
    m_list.InsertItem(i,NULL);
    for(j=0;j<nColCount;++j)
    {
    var = m_pRecordset->GetCollect(szTile[j]);
    if(var.vt != VT_NULL)
    {
    strBuf = (LPCTSTR)_bstr_t(var);
    strBuf.Trim();
    m_list.SetItemText(i,j,strBuf.GetBuffer());
    }
    }
    ++i;
    m_pRecordset->MoveNext();
    }
    m_pRecordset->Close();
    m_pConnection->Close();