首页 > 代码库 > ADO访问Access数据库错误解决心得随笔

ADO访问Access数据库错误解决心得随笔

最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下。

  1. 环境
    1. win7 x86系统;

    2. VS2012编译器;

    3. Office2010;

    4. Access2000~Access2003连接串建立数据库连接。

  2. 关键数据库操作代码
    1. BOOL CAccessDatabase::Query(const CString strSQLString, UINT nFieldNumber, vector<vector<_variant_t> >& vecvecVariant){    _variant_t Variant;    vector<_variant_t> vecVariant;    EnterCriticalSection(&m_cs);    _RecordsetPtr pRecordset = NULL;    HRESULT hr = S_FALSE;    try    {        hr = pRecordset.CreateInstance(_T("ADODB.Recordset"));        if (SUCCEEDED(hr))        {            hr = pRecordset->Open(strSQLString.AllocSysString(), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);            if (SUCCEEDED(hr))            {                if (!pRecordset->adoEOF)                {                    hr = pRecordset->MoveFirst();                    if (SUCCEEDED(hr))                    {                        while (!(pRecordset->adoEOF))                        {                            vecVariant.clear();                            for (UINT i = 0; i < nFieldNumber; ++i)                            {                                ZeroMemory(&Variant, sizeof(Variant));                                Variant = pRecordset->GetCollect(_variant_t((long)i));                                vecVariant.push_back(Variant);                            }                            vecvecVariant.push_back(vecVariant);                            hr = pRecordset->MoveNext();                        }                    }                    else                    {                        m_pLogFile->WriteLog(GetLastError(), _T("移动记录集指针到首部发生错误"));                        if (pRecordset->GetState() != adStateClosed)                        {                            hr = pRecordset->Close();                            if (FAILED(hr))                            {                                m_pLogFile->WriteLog(GetLastError(), _T("关闭记录集失败"));                            }                            else                            {                                m_pLogFile->WriteLog(GetLastError(), _T("记录集已关闭"));                            }                        }                        if (pRecordset != NULL)                        {                            pRecordset.Release();                            pRecordset = NULL;                        }                        LeaveCriticalSection(&m_cs);                        return FALSE;                    }                }                else                {                    m_pLogFile->WriteLog(GetLastError(), _T("查询的记录集为空"));                }            }            else            {                m_pLogFile->WriteLog(GetLastError(), _T("打开记录集失败"));                if (pRecordset != NULL)                {                    pRecordset.Release();                    pRecordset = NULL;                }                LeaveCriticalSection(&m_cs);                return FALSE;            }        }        else        {            m_pLogFile->WriteLog(GetLastError(), _T("初始化记录集失败"));            pRecordset = NULL;            LeaveCriticalSection(&m_cs);            return FALSE;        }    }    catch (_com_error e)    {        m_pLogFile->WriteLog(e.ErrorMessage());        AfxMessageBox(e.ErrorMessage());        LeaveCriticalSection(&m_cs);        return FALSE;    }    if (pRecordset->GetState() != adStateClosed)    {        try        {            hr = pRecordset->Close();            if (FAILED(hr))            {                m_pLogFile->WriteLog(GetLastError(), _T("关闭记录集失败"));            }            else            {                m_pLogFile->WriteLog(GetLastError(), _T("记录集已关闭"));            }        }        catch (_com_error err)        {            m_pLogFile->WriteLog(err.ErrorMessage());            AfxMessageBox(err.ErrorMessage());        }    }    if (pRecordset != NULL)    {        pRecordset.Release();        pRecordset = NULL;    }    LeaveCriticalSection(&m_cs);    return TRUE;}
  3. 数据库调用代码
    1.     if (!Database.Query(_T("select ZoneName from Zone"), 1, vecvecZone))    {        LogFile.WriteLog(GetLastError(), _T("从数据库中获取客户端名称失败"));        AfxMessageBox(_T("从数据库中获取客户端名称失败"));        return;    }
  4. 错误问题
    1. 程序在Query里面产生了异常。在调用pRecordset->Open(...)的时候产生了异常,异常错误信息是“未指定的错误”;
    2. 将调用的Sql语句放到Access数据库中可以正确执行。
  5. 解决办法
    1. 将数据库的表名"Zone"修改为"MyZone"等其它名称即可。
  6. 总结
    1. 在编程访问Access数据库时表名不能为"Zone"。
  7. 代码上传
    1. 下载连接:http://pan.baidu.com/s/1mgFlOqk