我用OLE DB连接ACCESS 表时,打开是成功的,但数据库中本来有三个字段,却读出四个,有几个记录,却显示没有记录,不知道是为什么?

解决方案 »

  1.   

    如果你使用的是 ado
    那么使用参数adOpenStatic,才可以,
    adOpendynamic总是得到记录数0对特别是ADO在多线程的时候它的有时是return的更是-1,可能是一个BUG吧,自己计数吧
    int count;
    while(!m_pRecordset->adoEOF)
    {

    count++;
    m_pRecordset->MoveNext();
    }
            m_pRecordset->MoveFirst();
      

  2.   

    大概的代码:
    BOOL CAddressList::ConnectDB()
    {
    HRESULT hr;
    hr = m_DataSource.Open(_T("Microsoft.Jet.OLEDB.4.0"), _T("DbNet.mdb"));//打开数据源
    if (FAILED(hr))
    {
    GetLastError(m_szLastErrorDesc);
    CString str = m_szLastErrorDesc;
    WriteLog(str, str.GetLength(), _T("Error:"));
    return FALSE;
    }
    //打开会话。
    hr = m_session.Open(m_DataSource);
    if(FAILED(hr))
    {
    m_DataSource.Close();
    GetLastError(m_szLastErrorDesc);
    CString str = m_szLastErrorDesc;
    WriteLog(str, str.GetLength(), _T("Error:"));
    return FALSE;
    } m_bConnect = TRUE;
    return TRUE;
    }
    BOOL CAddressList::ExecuteSQL(LPCTSTR pszSQL, CCommand<CManualAccessor> *prs)
    {
    CDBPropSet propset(DBPROPSET_ROWSET);
    propset.AddProperty(DBPROP_IRowsetChange, true);
    propset.AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
    propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
    propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE);

    HRESULT hr = prs->Open(m_session, pszSQL, &propset, NULL, DBGUID_DBSQL, FALSE);
    if (FAILED(hr))
    {
    GetLastError(m_szLastErrorDesc);
    CString str = m_szLastErrorDesc;
    WriteLog(str, str.GetLength(), _T("Error:"));
    return FALSE;
    } return TRUE;}BOOL CAddressList::OnInitDialog() 
    {
    //................
    if (!ConnectDB())
    {
    AfxMessageBox(m_szLastErrorDesc);
    CDialog::OnCancel();
    return FALSE;
    }
    //.....................
    }
    void CAddressList::LoadHistory(CMapStringToString &mapHIstory)
    {
    //.........................................
    if(!m_bConnect)
    {
    CString str = _T("数据库没有打开!");
    WriteLog(str, str.GetLength(), _T("Error:"));
    return;
    }
    CString strSQL;
    strSQL.Format(_T("SELECT * FROM History WHERE HID > '%d'"), nBegin);
    CCommand<CManualAccessor> *prs = new CCommand<CManualAccessor>;
    if (!ExecuteSQL(strSQL,prs ))
    {
    delete prs;
    prs = NULL;
    return;
    }
    else if (prs->m_spRowset == NULL)
    {
    CString str = _T("没有记录!");
    WriteLog(str, str.GetLength(), _T("Error:"));
    }
    else
    {
    USES_CONVERSION;
    ULONG ulColumns = 0;
    DBCOLUMNINFO* pColumnInfo = NULL;
    LPOLESTR pStrings = NULL;
    try
    { //得到列属性
    if (prs->GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)
    throw;
    //帮定缓存区
    struct MYBIND* pBind = new MYBIND[ulColumns];
    prs->CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);
    ULONG ulFields = prs->GetColumnCount(); WORD wType;
    for (long l = 0; l < ulFields; l++)
    {
    if (pColumnInfo[l].dwFlags & DBCOLUMNFLAGS_ISLONG )
    {
    pColumnInfo[l].wType = DBTYPE_IUNKNOWN;
    wType = pColumnInfo[l].wType;
    }
    else
    wType = DBTYPE_STR;

    prs->AddBindEntry(l+1, wType, sizeof(TCHAR)*40, &pBind[l].szValue,
    NULL, &pBind[l].dwStatus);
    }
    prs->Bind();
    //显示各个行
    while(prs->MoveNext() == S_OK)
    {
    for (ULONG j=0; j< ulFields; j++)
    {
    CString str;
    if (pBind[j].dwStatus == DBSTATUS_S_ISNULL)
    {
    break;
    }
    else if (pColumnInfo[j].wType == DBTYPE_IUNKNOWN)
    {
    ISequentialStream* pStream = *(ISequentialStream**)pBind[j].szValue;

    ULONG lRead = 0;
    char szBuf[CONTENT_LEN];
    do
    {
    pStream->Read(szBuf, CONTENT_LEN - 1, &lRead);
    szBuf[lRead] = '\0';
    str += szBuf;
    } while (lRead == CONTENT_LEN - 1);

    }
    else
    {
    str = pBind[j].szValue;
    }
    if(j == 0)
    {
    strTitle = str;
    }
    else
    {
    strURL = str;
    }
    }
    if(strTitle.IsEmpty()|| strURL.IsEmpty())
    {
    continue;
    }
    mapHIstory.SetAt(strTitle, strURL);
    }
    delete pBind;
    }
    catch(...)
    {
    GetLastError(m_szLastErrorDesc);
    CString str = m_szLastErrorDesc;
    WriteLog(str, str.GetLength(), _T("Error:"));
    return ;//返回TRUE表明错误信息已经显示。
    }
    }
    prs->Close();
    delete prs;
    prs = NULL;
    }
      

  3.   

    我也遇到过类似问题,如果你得到的字段固定,就手动设置一下吧,比如在你的程序中的改成这样:
    try
    { //得到列属性
    if (prs->GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)
    throw;
    //帮定缓存区
                               ulColumns = 3;//手动加这句了!
    然后试一试了!