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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM