最近在用ADO訪問Access數據庫的時候出現了一個奇怪的錯誤,覺得有必要記錄下來,和大家分享一下。
- 環境
-
win7 x86系統;
-
VS2012編譯器;
-
Office2010;
-
Access2000~Access2003連接串建立數據庫連接。
-
- 關鍵數據庫操作代碼
-
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; }
-
- 數據庫調用代碼
-
if (!Database.Query(_T("select ZoneName from Zone"), 1, vecvecZone)) { LogFile.WriteLog(GetLastError(), _T("從數據庫中獲取客戶端名稱失敗")); AfxMessageBox(_T("從數據庫中獲取客戶端名稱失敗")); return; }
-
- 錯誤問題
- 程序在Query里面產生了異常。在調用pRecordset->Open(...)的時候產生了異常,異常錯誤信息是“未指定的錯誤”;
- 將調用的Sql語句放到Access數據庫中可以正確執行。
- 解決辦法
- 將數據庫的表名"Zone"修改為"MyZone"等其它名稱即可。
- 總結
- 在編程訪問Access數據庫時表名不能為"Zone"。
- 代碼上傳
- 下載連接:http://pan.baidu.com/s/1mgFlOqk