ERROR.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:13k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // Microsoft OLE DB TABLECOPY Sample
  3. // Copyright (C) 1995-1998 Microsoft Corporation
  4. //
  5. // @doc
  6. //
  7. // @module ERROR.CPP
  8. //
  9. //-----------------------------------------------------------------------------
  10. ////////////////////////////////////////////////////////////////////////
  11. // Includes
  12. //
  13. ////////////////////////////////////////////////////////////////////////
  14. #include "WinMain.h"
  15. #include "Error.h"
  16. #include <olectl.h>   // IConnectionPoints interface
  17. ////////////////////////////////////////////////////////////////////////
  18. // Defines
  19. //
  20. ////////////////////////////////////////////////////////////////////////
  21. //Displays values like VALUE as   VALUE , L"VALUE"
  22. #define VALUE_WCHAR(value) value, L#value
  23. typedef struct _INTERFACEMAP
  24. {
  25. const IID* pIID; // The sql type value
  26. WCHAR* pwszInterface; // Name for display
  27. } INTERFACEMAP;
  28. INTERFACEMAP rgInterfaceMap[] =
  29. {
  30. //IUnknown
  31. & VALUE_WCHAR(IID_IUnknown),
  32. //TEnumerator
  33. & VALUE_WCHAR(IID_IParseDisplayName),
  34. & VALUE_WCHAR(IID_ISourcesRowset),
  35. //TDataSource
  36. & VALUE_WCHAR(IID_IDBInitialize),
  37. & VALUE_WCHAR(IID_IDBProperties),
  38. & VALUE_WCHAR(IID_IDBCreateSession),
  39. & VALUE_WCHAR(IID_IDBInfo),
  40. & VALUE_WCHAR(IID_IPersist),
  41. & VALUE_WCHAR(IID_IDBDataSourceAdmin),
  42. & VALUE_WCHAR(IID_IPersistFile),
  43. & VALUE_WCHAR(IID_ISupportErrorInfo),
  44. //TSession
  45. & VALUE_WCHAR(IID_IGetDataSource),
  46. & VALUE_WCHAR(IID_IOpenRowset),
  47. & VALUE_WCHAR(IID_ISessionProperties),
  48. & VALUE_WCHAR(IID_IDBCreateCommand),
  49. & VALUE_WCHAR(IID_IDBSchemaRowset),
  50. & VALUE_WCHAR(IID_IIndexDefinition),
  51. & VALUE_WCHAR(IID_ITableDefinition),
  52. & VALUE_WCHAR(IID_ITransactionJoin),
  53. & VALUE_WCHAR(IID_ITransactionLocal),
  54. & VALUE_WCHAR(IID_ITransactionObject),
  55. //TCommand
  56. & VALUE_WCHAR(IID_IAccessor),
  57. & VALUE_WCHAR(IID_IColumnsInfo),
  58. & VALUE_WCHAR(IID_ICommand),
  59. & VALUE_WCHAR(IID_ICommandProperties),
  60. & VALUE_WCHAR(IID_ICommandText),
  61. & VALUE_WCHAR(IID_IConvertType),
  62. & VALUE_WCHAR(IID_IColumnsRowset),
  63. & VALUE_WCHAR(IID_ICommandPrepare),
  64. & VALUE_WCHAR(IID_ICommandWithParameters),
  65. //TRowset
  66. & VALUE_WCHAR(IID_IRowset),
  67. & VALUE_WCHAR(IID_IRowsetInfo),
  68. & VALUE_WCHAR(IID_IColumnsRowset),
  69. & VALUE_WCHAR(IID_IConnectionPointContainer),
  70. & VALUE_WCHAR(IID_IRowsetChange),
  71. & VALUE_WCHAR(IID_IRowsetIdentity),
  72. & VALUE_WCHAR(IID_IRowsetLocate),
  73. & VALUE_WCHAR(IID_IRowsetResynch),
  74. & VALUE_WCHAR(IID_IRowsetScroll),
  75. & VALUE_WCHAR(IID_IRowsetUpdate),
  76. //TIndex
  77. & VALUE_WCHAR(IID_IRowsetIndex),
  78. //TError
  79. & VALUE_WCHAR(IID_IErrorInfo),
  80. & VALUE_WCHAR(IID_IErrorRecords),
  81. & VALUE_WCHAR(IID_ISQLErrorInfo),
  82. };
  83. ////////////////////////////////////////////////////////////////////////
  84. // ERRORMAP
  85. //
  86. ////////////////////////////////////////////////////////////////////////
  87. typedef struct _ERRORMAP
  88. {
  89. HRESULT hr; // HRESULT
  90. WCHAR* pwszError; // Name
  91. } ERRORMAP;
  92. ERRORMAP rgErrorMap[] =
  93. {
  94.  VALUE_WCHAR(NULL),
  95.  //System Errors
  96.  VALUE_WCHAR(E_FAIL),
  97.  VALUE_WCHAR(E_INVALIDARG),
  98.  VALUE_WCHAR(E_OUTOFMEMORY),
  99.  VALUE_WCHAR(E_NOINTERFACE),
  100.  VALUE_WCHAR(REGDB_E_CLASSNOTREG),
  101.  VALUE_WCHAR(CLASS_E_NOAGGREGATION),
  102.      VALUE_WCHAR(E_UNEXPECTED),
  103.      VALUE_WCHAR(E_NOTIMPL),
  104.      VALUE_WCHAR(E_POINTER),
  105.      VALUE_WCHAR(E_HANDLE),
  106.      VALUE_WCHAR(E_ABORT),
  107.      VALUE_WCHAR(E_ACCESSDENIED),
  108.      VALUE_WCHAR(E_PENDING),
  109.  //OLE DB Errors
  110.      VALUE_WCHAR(DB_E_BADACCESSORHANDLE),
  111.      VALUE_WCHAR(DB_E_ROWLIMITEXCEEDED),
  112.      VALUE_WCHAR(DB_E_READONLYACCESSOR),
  113.      VALUE_WCHAR(DB_E_SCHEMAVIOLATION),
  114.      VALUE_WCHAR(DB_E_BADROWHANDLE),
  115.      VALUE_WCHAR(DB_E_OBJECTOPEN),
  116.      VALUE_WCHAR(DB_E_CANTCONVERTVALUE),
  117.      VALUE_WCHAR(DB_E_BADBINDINFO),
  118.      VALUE_WCHAR(DB_SEC_E_PERMISSIONDENIED),
  119.      VALUE_WCHAR(DB_E_NOTAREFERENCECOLUMN),
  120.      VALUE_WCHAR(DB_E_NOCOMMAND),
  121.      VALUE_WCHAR(DB_E_BADBOOKMARK),
  122.      VALUE_WCHAR(DB_E_BADLOCKMODE),
  123.      VALUE_WCHAR(DB_E_PARAMNOTOPTIONAL),
  124.      VALUE_WCHAR(DB_E_BADCOLUMNID),
  125.      VALUE_WCHAR(DB_E_BADRATIO),
  126.      VALUE_WCHAR(DB_E_ERRORSINCOMMAND),
  127.      VALUE_WCHAR(DB_E_CANTCANCEL),
  128.      VALUE_WCHAR(DB_E_DIALECTNOTSUPPORTED),
  129.      VALUE_WCHAR(DB_E_DUPLICATEDATASOURCE),
  130.      VALUE_WCHAR(DB_E_CANNOTRESTART),
  131.      VALUE_WCHAR(DB_E_NOTFOUND),
  132.      VALUE_WCHAR(DB_E_NEWLYINSERTED),
  133.      VALUE_WCHAR(DB_E_UNSUPPORTEDCONVERSION),
  134.      VALUE_WCHAR(DB_E_BADSTARTPOSITION),
  135.      VALUE_WCHAR(DB_E_NOTREENTRANT),
  136.      VALUE_WCHAR(DB_E_ERRORSOCCURRED),
  137.      VALUE_WCHAR(DB_E_NOAGGREGATION),
  138.      VALUE_WCHAR(DB_E_DELETEDROW),
  139.      VALUE_WCHAR(DB_E_CANTFETCHBACKWARDS),
  140.      VALUE_WCHAR(DB_E_ROWSNOTRELEASED),
  141.      VALUE_WCHAR(DB_E_BADSTORAGEFLAG),
  142.      VALUE_WCHAR(DB_E_BADSTATUSVALUE),
  143.      VALUE_WCHAR(DB_E_CANTSCROLLBACKWARDS),
  144.      VALUE_WCHAR(DB_E_MULTIPLESTATEMENTS),
  145.      VALUE_WCHAR(DB_E_INTEGRITYVIOLATION),
  146.      VALUE_WCHAR(DB_E_ABORTLIMITREACHED),
  147.      VALUE_WCHAR(DB_E_DUPLICATEINDEXID),
  148.      VALUE_WCHAR(DB_E_NOINDEX),
  149.      VALUE_WCHAR(DB_E_INDEXINUSE),
  150.      VALUE_WCHAR(DB_E_NOTABLE),
  151.      VALUE_WCHAR(DB_E_CONCURRENCYVIOLATION),
  152.      VALUE_WCHAR(DB_E_BADCOPY),
  153.      VALUE_WCHAR(DB_E_BADPRECISION),
  154.      VALUE_WCHAR(DB_E_BADSCALE),
  155.      VALUE_WCHAR(DB_E_BADID),
  156.      VALUE_WCHAR(DB_E_BADTYPE),
  157.      VALUE_WCHAR(DB_E_DUPLICATECOLUMNID),
  158.      VALUE_WCHAR(DB_E_DUPLICATETABLEID),
  159.      VALUE_WCHAR(DB_E_TABLEINUSE),
  160.      VALUE_WCHAR(DB_E_NOLOCALE),
  161.      VALUE_WCHAR(DB_E_BADRECORDNUM),
  162.      VALUE_WCHAR(DB_E_BOOKMARKSKIPPED),
  163.      VALUE_WCHAR(DB_E_BADPROPERTYVALUE),
  164.      VALUE_WCHAR(DB_E_INVALID),
  165.      VALUE_WCHAR(DB_E_BADACCESSORFLAGS),
  166.      VALUE_WCHAR(DB_E_BADSTORAGEFLAGS),
  167.      VALUE_WCHAR(DB_E_BYREFACCESSORNOTSUPPORTED),
  168.      VALUE_WCHAR(DB_E_NULLACCESSORNOTSUPPORTED),
  169.      VALUE_WCHAR(DB_E_NOTPREPARED),
  170.      VALUE_WCHAR(DB_E_BADACCESSORTYPE),
  171.      VALUE_WCHAR(DB_E_WRITEONLYACCESSOR),
  172.      VALUE_WCHAR(DB_SEC_E_AUTH_FAILED),
  173.      VALUE_WCHAR(DB_E_CANCELED),
  174.      VALUE_WCHAR(DB_E_BADSOURCEHANDLE),
  175.      VALUE_WCHAR(DB_E_PARAMUNAVAILABLE),
  176.      VALUE_WCHAR(DB_E_ALREADYINITIALIZED),
  177.      VALUE_WCHAR(DB_E_NOTSUPPORTED),
  178.      VALUE_WCHAR(DB_E_MAXPENDCHANGESEXCEEDED),
  179.      VALUE_WCHAR(DB_E_BADORDINAL),
  180.      VALUE_WCHAR(DB_E_PENDINGCHANGES),
  181.      VALUE_WCHAR(DB_E_DATAOVERFLOW),
  182.      VALUE_WCHAR(DB_E_BADHRESULT),
  183.      VALUE_WCHAR(DB_E_BADLOOKUPID),
  184.      VALUE_WCHAR(DB_E_BADDYNAMICERRORID),
  185.      VALUE_WCHAR(DB_E_PENDINGINSERT),
  186.      VALUE_WCHAR(DB_E_BADCONVERTFLAG),
  187.      VALUE_WCHAR(DB_S_ROWLIMITEXCEEDED),
  188.      VALUE_WCHAR(DB_S_COLUMNTYPEMISMATCH),
  189.      VALUE_WCHAR(DB_S_TYPEINFOOVERRIDDEN),
  190.      VALUE_WCHAR(DB_S_BOOKMARKSKIPPED),
  191.      VALUE_WCHAR(DB_S_ENDOFROWSET),
  192.      VALUE_WCHAR(DB_S_COMMANDREEXECUTED),
  193.      VALUE_WCHAR(DB_S_BUFFERFULL),
  194.      VALUE_WCHAR(DB_S_NORESULT),
  195.      VALUE_WCHAR(DB_S_CANTRELEASE),
  196.      VALUE_WCHAR(DB_S_DIALECTIGNORED),
  197.      VALUE_WCHAR(DB_S_UNWANTEDPHASE),
  198.      VALUE_WCHAR(DB_S_UNWANTEDREASON),
  199.      VALUE_WCHAR(DB_S_COLUMNSCHANGED),
  200.      VALUE_WCHAR(DB_S_ERRORSRETURNED),
  201.      VALUE_WCHAR(DB_S_BADROWHANDLE),
  202.      VALUE_WCHAR(DB_S_DELETEDROW),
  203.      VALUE_WCHAR(DB_S_STOPLIMITREACHED),
  204.      VALUE_WCHAR(DB_S_LOCKUPGRADED),
  205.      VALUE_WCHAR(DB_S_PROPERTIESCHANGED),
  206.      VALUE_WCHAR(DB_S_ERRORSOCCURRED),
  207.      VALUE_WCHAR(DB_S_PARAMUNAVAILABLE),
  208.      VALUE_WCHAR(DB_S_MULTIPLECHANGES),
  209. };
  210. ////////////////////////////////////////////////////////////////////////
  211. // WCHAR* GetErrorName
  212. //
  213. ////////////////////////////////////////////////////////////////////////
  214. WCHAR* GetErrorName(HRESULT hr)
  215. {
  216. for(ULONG i=0; i<NUMELE(rgErrorMap); i++)
  217. {
  218. if(hr == rgErrorMap[i].hr) 
  219. return rgErrorMap[i].pwszError;
  220. }
  221. //Otherwise just return Unknown
  222. return rgErrorMap[0].pwszError;
  223. }
  224. ////////////////////////////////////////////////////////////////////////
  225. // WCHAR* GetInterfaceName
  226. //
  227. ////////////////////////////////////////////////////////////////////////
  228. WCHAR* GetInterfaceName(REFIID riid)
  229. {
  230. for(ULONG i=0; i<NUMELE(rgInterfaceMap); i++)
  231. {
  232. if(riid == *(rgInterfaceMap[i].pIID)) 
  233. return rgInterfaceMap[i].pwszInterface;
  234. }
  235. //Otherwise just return IUnknown
  236. return rgInterfaceMap[0].pwszInterface;
  237. }
  238. ////////////////////////////////////////////////////////////////////////
  239. // HRESULT GetErrorRecords
  240. //
  241. // Get the error message generated by an OLE DB object
  242. /////////////////////////////////////////////////////////////////////////////
  243. HRESULT GetErrorRecords(ULONG* pcRecords, IErrorRecords** ppIErrorRecords)
  244. {
  245. ASSERT(pcRecords && ppIErrorRecords);
  246. HRESULT hr;
  247. //NULL output params
  248. *pcRecords = 0;
  249. *ppIErrorRecords = NULL;
  250. ISupportErrorInfo* pISupportErrorInfo = NULL;
  251. IErrorInfo* pIErrorInfo = NULL;
  252. //See if this interface supports ErrorInfo
  253. //If not there is no reason to display any error
  254. if((hr = GetErrorInfo(0, &pIErrorInfo))==S_OK && pIErrorInfo)
  255. {
  256. //IErrorRecords may not be supported on the existing error object.
  257. //Some other things could have posted an error object (VB) for example...
  258. QTESTC(hr = pIErrorInfo->QueryInterface(IID_IErrorRecords, (void**)ppIErrorRecords));
  259. XTESTC(hr = (*ppIErrorRecords)->GetRecordCount(pcRecords));
  260. }
  261. CLEANUP:
  262. SAFE_RELEASE(pISupportErrorInfo);
  263. SAFE_RELEASE(pIErrorInfo);
  264. return hr;
  265. }
  266. ////////////////////////////////////////////////////////////////////////
  267. // HRESULT GetSqlErrorInfo
  268. //
  269. // Get the error message generated by an OLE DB object
  270. /////////////////////////////////////////////////////////////////////////////
  271. HRESULT GetSqlErrorInfo(ULONG iRecord, IErrorRecords* pIErrorRecords, BSTR* pBstr)
  272. {
  273. ASSERT(pBstr);
  274. HRESULT hr = S_OK;
  275. ISQLErrorInfo* pISQLErrorInfo = NULL;
  276. LONG lNativeError = 0;
  277. //Get the Error Records
  278. if(pIErrorRecords)
  279. {
  280. //If there is ErrorInfo, GetSQLInfo for the desired record
  281. //ISQLErrorInfo is not mandatory
  282. QTESTC(hr = pIErrorRecords->GetCustomErrorObject(iRecord, IID_ISQLErrorInfo, (IUnknown**)&pISQLErrorInfo));
  283. //If there was a CustomErrorObject
  284. if(pISQLErrorInfo)
  285. hr = pISQLErrorInfo->GetSQLInfo(pBstr, &lNativeError);
  286. }
  287. CLEANUP:
  288. SAFE_RELEASE(pISQLErrorInfo);
  289. return hr;
  290. }
  291. ////////////////////////////////////////////////////////////////////////
  292. // HRESULT DisplayAllErrors
  293. //
  294. /////////////////////////////////////////////////////////////////////////////
  295. HRESULT DisplayAllErrors(HWND hWnd, HRESULT Actualhr, WCHAR* pwszFile, ULONG ulLine)
  296. {
  297. HRESULT hr = S_OK;
  298. ULONG cRecords = 0;
  299. IErrorRecords* pIErrorRecords = NULL;
  300. //Try to display Extened ErrorInfo
  301. if((hr = GetErrorRecords(&cRecords, &pIErrorRecords))==S_OK) 
  302. {
  303. hr = DisplayErrorRecords(hWnd, cRecords, pIErrorRecords, pwszFile, ulLine);
  304. }
  305. //If not available, display MSG Box with info
  306. else
  307. {
  308. //display the Error
  309. wMessageBox(hWnd, (hWnd ? MB_APPLMODAL : MB_TASKMODAL) | MB_ICONEXCLAMATION | MB_OK, wsz_ERRORINFO, 
  310. L"Interface: %snResult: %x = %snnIErrorInfo: %snnFile: %snLine: %d", L"Unknown", Actualhr, GetErrorName(Actualhr), L"Error Object not available", pwszFile, ulLine);
  311. }
  312. SAFE_RELEASE(pIErrorRecords);
  313. return hr;
  314. }
  315. ////////////////////////////////////////////////////////////////////////
  316. // HRESULT DisplayErrorRecords
  317. //
  318. /////////////////////////////////////////////////////////////////////////////
  319. HRESULT DisplayErrorRecords(HWND hWnd, ULONG cRecords, IErrorRecords* pIErrorRecords, WCHAR* pwszFile, ULONG ulLine)
  320. {
  321. HRESULT hr = S_OK;
  322. IErrorInfo* pIErrorInfo = NULL;
  323. BSTR bstrErrorInfo = NULL;
  324. BSTR bstrSQLInfo = NULL;
  325. LCID lcid = GetSystemDefaultLCID(); 
  326. //Get the Error Records
  327. if(cRecords && pIErrorRecords)
  328. {
  329. LONG lNativeError = 0;
  330. ERRORINFO ErrorInfo;
  331. //Loop through the records
  332. for(ULONG i=0; i<cRecords; i++)
  333. {
  334. //GetErrorInfo
  335. XTESTC(hr = pIErrorRecords->GetErrorInfo(i,lcid,&pIErrorInfo));
  336. //Get the Description
  337. XTESTC(hr = pIErrorInfo->GetDescription(&bstrErrorInfo));
  338. //Get the Basic ErrorInfo
  339. XTESTC(hr = pIErrorRecords->GetBasicErrorInfo(i,&ErrorInfo));
  340. //Get the SQL Info
  341. GetSqlErrorInfo(i, pIErrorRecords, &bstrSQLInfo);
  342. //Display the Error
  343. if(bstrSQLInfo)
  344. wMessageBox(hWnd, (hWnd ? MB_APPLMODAL : MB_TASKMODAL) | MB_ICONEXCLAMATION | MB_OK, wsz_ERRORINFO, L"Interface: %snResult: %x = %snnIErrorInfo: [%s] %snnFile: %snLine: %d", GetInterfaceName(ErrorInfo.iid), ErrorInfo.hrError, GetErrorName(ErrorInfo.hrError), bstrSQLInfo, bstrErrorInfo, pwszFile, ulLine);
  345. else
  346. wMessageBox(hWnd, (hWnd ? MB_APPLMODAL : MB_TASKMODAL) | MB_ICONEXCLAMATION | MB_OK, wsz_ERRORINFO, L"Interface: %snResult: %x = %snnIErrorInfo: %snnFile: %snLine: %d", GetInterfaceName(ErrorInfo.iid), ErrorInfo.hrError, GetErrorName(ErrorInfo.hrError), bstrErrorInfo, pwszFile, ulLine);
  347. SAFE_RELEASE(pIErrorInfo);
  348. SAFE_SYSFREE(bstrErrorInfo);
  349. SAFE_SYSFREE(bstrSQLInfo);
  350. }
  351. }
  352. CLEANUP:
  353. SAFE_RELEASE(pIErrorInfo);
  354. SAFE_SYSFREE(bstrErrorInfo);
  355. SAFE_SYSFREE(bstrSQLInfo);
  356. return hr;
  357. }