zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)
    leetcode 题解:Remove Duplicates from Sorted Array II(已排序数组去三次及以上重复元素)
    leetcode 题解:Remove Duplicates from Sorted Array(已排序数组去重)
    leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)
    leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)
    c++ STL:队列queue、优先队列priority queue 的使用
    leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)
    算术表达式解析(第三版)词法分析版
    经典算法:牛顿迭代法求平方根
    进入游戏行业1年的总结
  • 原文地址:https://www.cnblogs.com/qiyueliuguang/p/3807744.html
Copyright © 2011-2022 走看看