OLEDBErrorChecking.h
上传用户:benben_wyd
上传日期:2010-02-26
资源大小:1229k
文件大小:22k
源码类别:

书籍源码

开发平台:

Visual C++

  1. #ifndef Chucks_Error_Routine_Included
  2. #define Chucks_Error_Routine_Included
  3. #include <oledberr.h>
  4. #include <atldbcli.h>
  5. class COLEDBErrorChecking {
  6. public:
  7. //Inline functions
  8. BOOL DBErrorsAreSupported(CComPtr<IUnknown> m_spUnk)
  9. {
  10. CComPtr<ISupportErrorInfo> spSupportErrorInfo;
  11. if (SUCCEEDED(
  12. m_spUnk->QueryInterface(IID_ISupportErrorInfo,
  13. (void **) &spSupportErrorInfo))) {
  14. if (SUCCEEDED(
  15. spSupportErrorInfo->
  16. InterfaceSupportsErrorInfo(IID_ICommandPrepare))){
  17. return TRUE;
  18. }
  19. }
  20. return FALSE;
  21. }
  22. void GetDBErrors(CComPtr<IUnknown> m_spUnk, char *msg)
  23. {
  24. CDBErrorInfo errInfo;
  25. IErrorInfo *pErrorInfo = NULL;
  26. BSTR pErrorDescription = NULL;
  27. ULONG ulRecords = 0;
  28. HRESULT hr = 
  29. errInfo.GetErrorRecords(m_spUnk, 
  30. IID_ICommandPrepare, &ulRecords);
  31. if (FAILED(hr) || hr == S_FALSE || ulRecords == 0) {
  32. //The error info object could not be retrieved
  33. strcat(msg, "nnCould not retrieve an error info object.");
  34. strcat(msg, "nTherefore, additional error information is not available.");
  35. }
  36. else {
  37. // Error info object was retrieved successfully
  38. LCID lcid = GetUserDefaultLCID();
  39. for (ULONG loop = 0; loop < ulRecords; loop ++) {
  40. // Get the error information from the source
  41. hr = errInfo.GetErrorInfo(loop, lcid, &pErrorInfo);
  42. if (FAILED(hr)) {
  43. continue;
  44. }
  45. //Get the error description
  46. pErrorInfo->GetDescription(&pErrorDescription);
  47. //Convert error description to single-width character
  48. sprintf(msg, "%snn%S", msg, pErrorDescription);
  49. //Get SQLState and Error Code
  50. GetSQLCodes(msg, &errInfo, loop);
  51. //Clean up
  52. SysFreeString(pErrorDescription);
  53. pErrorInfo->Release();
  54. }
  55. }
  56. }
  57. void DisplayDBErrors(CComPtr<IUnknown> m_spUnk, char *msg)
  58. {
  59. //Allow 1 k for the error message
  60. char message[1024];
  61. if (msg) 
  62. strcpy(message, msg);
  63. else
  64. strcpy (message, "");
  65. if (m_spUnk) 
  66. if (DBErrorsAreSupported(m_spUnk)) 
  67. GetDBErrors(m_spUnk, message);
  68. else
  69. DisplaySingleError();
  70. else
  71. DisplaySingleError();
  72. }
  73. void DisplayAllErrors(CComPtr<IUnknown> m_spUnk, 
  74. char *msg = NULL, 
  75. HRESULT hresult = S_OK, 
  76. char *strFunction = NULL)
  77. {
  78. //Allow 1 k for the error message
  79. char message[1024];
  80. if (msg) 
  81. strcpy(message, msg);
  82. else
  83. strcpy (message, "");
  84. if (strFunction) { //Check for function equal to null
  85. //Function was passed, so see what function it was
  86. strcat(message, " in the ");
  87. strcat(message, strFunction);
  88. strcat(message, " function ");
  89. }
  90. if (FAILED(hresult)) {
  91. GetHRRESULTMessage(hresult, message);
  92. }
  93. DisplayDBErrors(m_spUnk, message);
  94. }
  95. //Static functions
  96. static void DisplaySingleError(HRESULT hresult = S_OK, char *strFunction = NULL)
  97. {
  98. //Allow 1 k for the error message
  99. char msg[1024];
  100. strcpy (msg, "");
  101. if (strFunction) { //Check for function equal to null
  102. //Function was passed, so see what function it was
  103. strcat(msg, "Error occurred in the ");
  104. strcat(msg, strFunction);
  105. strcat(msg, " function n");
  106. }
  107. if (FAILED(hresult)) {
  108. GetHRRESULTMessage(hresult, msg);
  109. }
  110. GetSingleError(msg);
  111. ::MessageBox(NULL, msg, "Error Message", MB_OK);
  112. }
  113. static void GetSingleError(char *msg) 
  114. {
  115. IErrorInfo *pErrorInfo = NULL;
  116. BSTR pErrorDescription = NULL;
  117. if (SUCCEEDED(GetErrorInfo(0, &pErrorInfo))) {
  118. //Get the error description
  119. if (SUCCEEDED(pErrorInfo->GetDescription(&pErrorDescription))) {
  120. //Convert error description to single-width character
  121. sprintf(msg, "%snn%S", msg, pErrorDescription);
  122. //Clean up
  123. SysFreeString(pErrorDescription);
  124. }
  125. else {
  126. strcat(msg, "Could not find the error description");
  127. }
  128. pErrorInfo->Release();
  129. }
  130. else {
  131. strcat(msg, "Could not retrieve error information");
  132. }
  133. }
  134. static void GetSQLCodes(char *msg, CDBErrorInfo *errInfo, ULONG errorNum = 0)
  135. {
  136. //COM Error Interface to retrieve error codes
  137. CComPtr<ISQLErrorInfo> spSQLErrorInfo;
  138. char SQLState[100]; //Buffer for error message
  139. if (SUCCEEDED(errInfo->GetCustomErrorObject(errorNum, 
  140. IID_ISQLErrorInfo,
  141. (IUnknown**) &spSQLErrorInfo))) {
  142. BSTR bstrSQLState = NULL; //SQLState that's returned
  143. LONG errorCode; //SQL Code that's returned
  144. //Retrieve the error code and SQLState
  145. if (SUCCEEDED(spSQLErrorInfo->GetSQLInfo(&bstrSQLState, &errorCode))) {
  146. //Form an error message
  147. sprintf(SQLState, 
  148. "nnSQLState is %SnError code is %ld",
  149. bstrSQLState, errorCode);
  150. //Concatenate the error message to the existing message
  151. strcat(msg, SQLState);
  152. SysFreeString(bstrSQLState); //Clean up
  153. }
  154. else {
  155. strcat(msg, 
  156.    "nnCould not get SQL info.");
  157. }
  158. }
  159. else {    //Something went wrong
  160. strcat(msg, 
  161.    "nnCould not get error or SQLState code.");
  162. }
  163. }
  164. static void DisplayHRRESULTMessage(HRESULT hr, char *strFunction = NULL)
  165. {
  166. if (FAILED(hr)) {
  167. //Allow 1 k for the error message
  168. char message[1024];
  169. strcpy (message, "");
  170. if (strFunction) { //Check for function equal to null
  171. //Function was passed, so see what function it was
  172. strcat(message, "An Error occurred in the ");
  173. strcat(message, strFunction);
  174. strcat(message, " function nn");
  175. }
  176. GetHRRESULTMessage(hr, message);
  177. ::MessageBox(NULL, message, "Database HR Error", MB_OK);
  178. }
  179. }
  180. static void GetHRRESULTMessage(HRESULT hr, char *msg)
  181. {
  182. sprintf(msg, "%snHRESULT was 0x%X:", msg, hr);
  183. switch (hr) {
  184. case DB_E_ABORTLIMITREACHED :
  185. strcat(msg, "nYour execution was aborted because a resource limit has been reached. No results are returned when this error occurs.");
  186. break;
  187. case DB_E_ALREADYINITIALIZED :
  188. strcat(msg, "nYou tried to initialize a data source that has already been initialized.");
  189. break;
  190. case DB_E_BADACCESSORFLAGS :
  191. strcat(msg, "nInvalid accessor flags");
  192. break;
  193. case DB_E_BADACCESSORHANDLE :
  194. strcat(msg, "nInvalid accessor handle");
  195. break;
  196. case DB_E_BADACCESSORTYPE :
  197. strcat(msg, "nThe specified accessor was not a parameter accessor");
  198. break;
  199. case DB_E_BADBINDINFO :
  200. strcat(msg, "nInvalid binding information");
  201. break;
  202. case DB_E_BADBOOKMARK :
  203. strcat(msg, "nInvalid bookmark");
  204. break;
  205. case DB_E_BADCHAPTER :
  206. strcat(msg, "nInvalid chapter");
  207. break;
  208. case DB_E_BADCOLUMNID :
  209. strcat(msg, "nInvalid column ID");
  210. break;
  211. case DB_E_BADCOMPAREOP :
  212. strcat(msg, "nThe comparison operator was invalid");
  213. break;
  214. case DB_E_BADCONVERTFLAG :
  215. strcat(msg, "nInvalid conversion flag");
  216. break;
  217. case DB_E_BADCOPY :
  218. strcat(msg, "nErrors were detected during a copy");
  219. break;
  220. case DB_E_BADDYNAMICERRORID :
  221. strcat(msg, "nThe supplied DynamicErrorID was invalid");
  222. break;
  223. case DB_E_BADHRESULT :
  224. strcat(msg, "nThe supplied HRESULT was invalid");
  225. break;
  226. // case DB_E_BADID :
  227. // DB_E_BADID is deprecated. 
  228. // Use DB_E_BADTABLEID instead.
  229. // break;
  230. case DB_E_BADLOCKMODE :
  231. strcat(msg, "nInvalid lock mode");
  232. break;
  233. case DB_E_BADLOOKUPID :
  234. strcat(msg, "nInvalid LookupID");
  235. break;
  236. case DB_E_BADORDINAL :
  237. strcat(msg, "nThe specified column number does not exist.");
  238. break;
  239. case DB_E_BADPARAMETERNAME :
  240. strcat(msg, "nThe given parameter name is not recognized.");
  241. break;
  242. case DB_E_BADPRECISION :
  243. strcat(msg, "nA specified precision is invalid");
  244. break;
  245. case DB_E_BADPROPERTYVALUE :
  246. strcat(msg, "nThe value of a property is invalid");
  247. break;
  248. case DB_E_BADRATIO :
  249. strcat(msg, "nInvalid ratio");
  250. break;
  251. case DB_E_BADRECORDNUM :
  252. strcat(msg, "nThe specified record number is invalid");
  253. break;
  254. case DB_E_BADROWHANDLE :
  255. strcat(msg, "nInvalid row handle.  This error often occurs when you are at BOF or EOF of a rowset and you try to update your data set.");
  256. break;
  257. case DB_E_BADSCALE :
  258. strcat(msg, "nA specified scale was invalid");
  259. break;
  260. case DB_E_BADSOURCEHANDLE :
  261. strcat(msg, "nInvalid source handle");
  262. break;
  263. case DB_E_BADSTARTPOSITION :
  264. strcat(msg, "nThe rows offset specified would position you before the beginning or past the end of the rowset.");
  265. break;
  266. case DB_E_BADSTATUSVALUE :
  267. strcat(msg, "nThe specified status flag was neither DBCOLUMNSTATUS_OK nor DBCOLUMNSTATUS_ISNULL");
  268. break;
  269. case DB_E_BADSTORAGEFLAG :
  270. strcat(msg, "nOne of the specified storage flags was not supported");
  271. break;
  272. case DB_E_BADSTORAGEFLAGS :
  273. strcat(msg, "nInvalid storage flags");
  274. break;
  275. case DB_E_BADTABLEID :
  276. strcat(msg, "nInvalid table ID");
  277. break;
  278. case DB_E_BADTYPE :
  279. strcat(msg, "nA specified type was invalid");
  280. break;
  281. case DB_E_BADTYPENAME :
  282. strcat(msg, "nThe given type name was unrecognized");
  283. break;
  284. case DB_E_BADVALUES :
  285. strcat(msg, "nInvalid value");
  286. break;
  287. case DB_E_BOOKMARKSKIPPED :
  288. strcat(msg, "nAlthough the bookmark was validly formed, no row could be found to match it");
  289. break;
  290. case DB_E_BYREFACCESSORNOTSUPPORTED :
  291. strcat(msg, "nBy reference accessors are not supported by this provider");
  292. break;
  293. case DB_E_CANCELED :
  294. strcat(msg, "nThe change was canceled during notification; no columns are changed");
  295. break;
  296. case DB_E_CANNOTRESTART :
  297. strcat(msg, "nThe rowset was built over a live data feed and cannot be restarted.");
  298. break;
  299. case DB_E_CANTCANCEL :
  300. strcat(msg, "nThe executing command cannot be canceled.");
  301. break;
  302. case DB_E_CANTCONVERTVALUE :
  303. strcat(msg, "nA literal value in the command could not be converted to the correct type due to a reason other than data overflow.");
  304. break;
  305. case DB_E_CANTFETCHBACKWARDS :
  306. strcat(msg, "nThe rowset does not support backward scrolling.");
  307. break;
  308. case DB_E_CANTFILTER :
  309. strcat(msg, "nThe requested filter could not be opened.");
  310. break;
  311. case DB_E_CANTORDER :
  312. strcat(msg, "nThe requested order could not be opened.");
  313. break;
  314. case DB_E_CANTSCROLLBACKWARDS :
  315. strcat(msg, "nThe rowset cannot scroll backwards.");
  316. break;
  317. case DB_E_CANTTRANSLATE :
  318. strcat(msg, "nCannot represent the current tree as text.");
  319. break;
  320. case DB_E_CHAPTERNOTRELEASED :
  321. strcat(msg, "nThe rowset was single-chaptered and the chapter was not released when a new chapter formation is attempted.");
  322. break;
  323. case DB_E_CONCURRENCYVIOLATION :
  324. strcat(msg, "nThe rowset was using optimistic concurrency and the value of a column has been changed since it was last read.");
  325. break;
  326. case DB_E_DATAOVERFLOW :
  327. strcat(msg, "nA literal value in the command overflowed the range of the type of the associated column");
  328. break;
  329. case DB_E_DELETEDROW :
  330. strcat(msg, "nThe row that is referred to has been deleted.");
  331. break;
  332. case DB_E_DIALECTNOTSUPPORTED :
  333. strcat(msg, "nThe provider does not support the specified dialect");
  334. break;
  335. case DB_E_DUPLICATECOLUMNID :
  336. strcat(msg, "nA column ID was occurred more than once in the specification");
  337. break;
  338. case DB_E_DUPLICATEDATASOURCE :
  339. strcat(msg, "nA new data source is trying to be formed when a data source with that specified name already exists.");
  340. break;
  341. case DB_E_DUPLICATEINDEXID :
  342. strcat(msg, "nThe specified index already exists.");
  343. break;
  344. case DB_E_DUPLICATETABLEID :
  345. strcat(msg, "nThe specified table already exists.");
  346. break;
  347. case DB_E_ERRORSINCOMMAND :
  348. strcat(msg, "nThe command contained one or more errors.");
  349. break;
  350. case DB_E_ERRORSOCCURRED :
  351. strcat(msg, "nErrors occurred.  This message is thrown when an error occurs that is not captured by one of the other error messages.");
  352. break;
  353. case DB_E_INDEXINUSE :
  354. strcat(msg, "nThe specified index was in use.");
  355. break;
  356. case DB_E_INTEGRITYVIOLATION :
  357. strcat(msg, "nA specified value violated the referential integrity constraints for a column or table.");
  358. break;
  359. case DB_E_INVALID :
  360. strcat(msg, "nThe rowset is invalide.");
  361. break;
  362. case DB_E_MAXPENDCHANGESEXCEEDED :
  363. strcat(msg, "nThe number of rows with pending changes has exceeded the set limit.");
  364. break;
  365. case DB_E_MULTIPLESTATEMENTS :
  366. strcat(msg, "nThe provider does not support multi-statement commands.");
  367. break;
  368. case DB_E_MULTIPLESTORAGE :
  369. strcat(msg, "nMultiple storage objects can not be open simultaneously.");
  370. break;
  371. case DB_E_NEWLYINSERTED :
  372. strcat(msg, "nThe provider is unable to determine identity for newly inserted rows.");
  373. break;
  374. case DB_E_NOAGGREGATION :
  375. strcat(msg, "nA non-NULL controlling IUnknown was specified and the object being created does not support aggregation.");
  376. break;
  377. case DB_E_NOCOMMAND :
  378. strcat(msg, "nNo command has been set for the command object.");
  379. break;
  380. case DB_E_NOINDEX :
  381. strcat(msg, "nThe specified index does not exist.");
  382. break;
  383. case DB_E_NOLOCALE :
  384. strcat(msg, "nThe specified locale ID was not supported.");
  385. break;
  386. case DB_E_NOQUERY :
  387. strcat(msg, "nInformation was requested for a query, and the query was not set.");
  388. break;
  389. case DB_E_NOTABLE :
  390. strcat(msg, "nThe specified table does not exist.");
  391. break;
  392. case DB_E_NOTAREFERENCECOLUMN :
  393. strcat(msg, "nSpecified column does not contain bookmarks or chapters.");
  394. break;
  395. case DB_E_NOTFOUND :
  396. strcat(msg, "nNo key matching the described characteristics could be found within the current range.");
  397. break;
  398. case DB_E_NOTPREPARED :
  399. strcat(msg, "nThe command was not prepared.");
  400. break;
  401. case DB_E_NOTREENTRANT :
  402. strcat(msg, "nProvider called a method from IRowsetNotify in the consumer and the method has not yet returned.");
  403. break;
  404. case DB_E_NOTSUPPORTED :
  405. strcat(msg, "nThe provider does not support this method.");
  406. break;
  407. case DB_E_NULLACCESSORNOTSUPPORTED :
  408. strcat(msg, "nNull accessors are not supported by this provider.");
  409. break;
  410. case DB_E_OBJECTOPEN :
  411. strcat(msg, "nAn object was open.");
  412. break;
  413. case DB_E_PARAMNOTOPTIONAL :
  414. strcat(msg, "nNo value given for one or more required parameters.");
  415. break;
  416. case DB_E_PARAMUNAVAILABLE :
  417. strcat(msg, "nThe provider cannot derive parameter info and SetParameterInfo has not been called.");
  418. break;
  419. case DB_E_PENDINGCHANGES :
  420. strcat(msg, "nThere are pending changes on a row with a reference count of zero.");
  421. break;
  422. case DB_E_PENDINGINSERT :
  423. strcat(msg, "nUnable to get visible data for a newly-inserted row that has not yet been updated.");
  424. break;
  425. case DB_E_READONLYACCESSOR :
  426. strcat(msg, "nUnable to write with a read-only accessor.");
  427. break;
  428. case DB_E_ROWLIMITEXCEEDED :
  429. strcat(msg, "nCreating another row would have exceeded the total number of active rows supported by the rowset.");
  430. break;
  431. case DB_E_ROWSETINCOMMAND :
  432. strcat(msg, "nCannot clone a command object whose command tree contains a rowset or rowsets.");
  433. break;
  434. case DB_E_ROWSNOTRELEASED :
  435. strcat(msg, "nAll HROWs must be released before new ones can be obtained.");
  436. break;
  437. case DB_E_SCHEMAVIOLATION :
  438. strcat(msg, "nGiven values violate the database schema.");
  439. break;
  440. case DB_E_TABLEINUSE :
  441. strcat(msg, "nThe specified table was in use.");
  442. break;
  443. case DB_E_UNSUPPORTEDCONVERSION :
  444. strcat(msg, "nRequested conversion is not supported.");
  445. break;
  446. case DB_E_WRITEONLYACCESSOR :
  447. strcat(msg, "nThe given accessor was write-only.");
  448. break;
  449. case DB_S_ASYNCHRONOUS :
  450. strcat(msg, "nThe operation is being processed asynchronously.");
  451. break;
  452. case DB_S_BADROWHANDLE :
  453. strcat(msg, "nInvalid row handle. This error often occurs when you are at BOF or EOF of a rowset and you try to update your data set.");
  454. break;
  455. case DB_S_BOOKMARKSKIPPED :
  456. strcat(msg, "nSkipped bookmark for deleted or non-member row.");
  457. break;
  458. case DB_S_BUFFERFULL :
  459. strcat(msg, "nVariable data buffer full.  Increase system memory, commit open transactions, free more system memory, or declare larger buffers in you database setup.");
  460. break;
  461. case DB_S_CANTRELEASE :
  462. strcat(msg, "nServer cannot release or 
  463. downgrade a lock until the end of the transaction.");
  464. break;
  465. case DB_S_COLUMNSCHANGED :
  466. strcat(msg, "nIn order to reposition to the start of the rowset, the provider had to reexecute the query; either the order of the columns changed or columns were added to or removed from the rowset.");
  467. break;
  468. case DB_S_COLUMNTYPEMISMATCH :
  469. strcat(msg, "nOne or more column types are incompatible. Conversion errors will occur during copying.");
  470. break;
  471. case DB_S_COMMANDREEXECUTED :
  472. strcat(msg, "nThe provider re-executed the command.");
  473. break;
  474. case DB_S_DELETEDROW :
  475. strcat(msg, "nA given HROW referred to a hard-deleted row.");
  476. break;
  477. case DB_S_DIALECTIGNORED :
  478. strcat(msg, "nInput dialect was ignored and text was returned in different dialect.");
  479. break;
  480. case DB_S_ENDOFROWSET :
  481. strcat(msg, "nReached start or end of rowset or chapter.");
  482. break;
  483. case DB_S_ERRORSOCCURRED :
  484. strcat(msg, "nErrors occurred. DB_S_ERRORSOCCURRED flag was set.");
  485. break;
  486. case DB_S_ERRORSRETURNED :
  487. strcat(msg, "nThe method had some errors; errors have been returned in the error array.");
  488. break;
  489. case DB_S_LOCKUPGRADED :
  490. strcat(msg, "nA lock was upgraded from the value specified.");
  491. break;
  492. case DB_S_MULTIPLECHANGES :
  493. strcat(msg, "nUpdating this row caused more than one row to be updated in the data source.");
  494. break;
  495. case DB_S_NONEXTROWSET :
  496. strcat(msg, "nThere are no more rowsets.");
  497. break;
  498. case DB_S_NORESULT :
  499. strcat(msg, "nThere are no more results.");
  500. break;
  501. case DB_S_PARAMUNAVAILABLE :
  502. strcat(msg, "nA specified parameter was invalid.");
  503. break;
  504. case DB_S_PROPERTIESCHANGED :
  505. strcat(msg, "nOne or more properties were changed as allowed by provider.");
  506. break;
  507. case DB_S_ROWLIMITEXCEEDED :
  508. strcat(msg, "nFetching requested number of rows would have exceeded total number of active rows supported by the rowset.");
  509. break;
  510. case DB_S_STOPLIMITREACHED :
  511. strcat(msg, "nExecution stopped because a resource limit has been reached. Results obtained so far have been returned but execution cannot be resumed.");
  512. break;
  513. case DB_S_TYPEINFOOVERRIDDEN :
  514. strcat(msg, "nCaller has overridden parameter type information.");
  515. break;
  516. case DB_S_UNWANTEDOPERATION :
  517. strcat(msg, "nConsumer is uninterested in receiving further notification calls for this reason");
  518. break;
  519. case DB_S_UNWANTEDPHASE :
  520. strcat(msg, "nConsumer is uninterested in receiving further notification calls for this phase");
  521. break;
  522. case DB_S_UNWANTEDREASON :
  523. strcat(msg, "nConsumer is uninterested in receiving further notification calls for this reason.");
  524. break;
  525. case DB_SEC_E_AUTH_FAILED :
  526. strcat(msg, "nAuthentication failed");
  527. break;
  528. case DB_SEC_E_PERMISSIONDENIED :
  529. strcat(msg, "nPermission denied");
  530. break;
  531. case MD_E_BADCOORDINATE :
  532. strcat(msg, "nBad coordinate for the OLAP dataset.");
  533. break;
  534. case MD_E_BADTUPLE :
  535. strcat(msg, "nBad tuple for the OLAP dataset");
  536. break;
  537. case MD_E_INVALIDAXIS :
  538. strcat(msg, "nThe given axis was not valid for this OLAP dataset.");
  539. break;
  540. case MD_E_INVALIDCELLRANGE :
  541. strcat(msg, "nOne or more of the given cell ordinals was invalid for this OLAP dataset.");
  542. break;
  543. #if(OLEDBVER >= 0x0250)
  544. //Errors if OLE DB version is greater than 2.5
  545. case DB_E_BADREGIONHANDLE :
  546. strcat(msg, "nInvalid region handle");
  547. break;
  548. case DB_E_CANNOTFREE :
  549. strcat(msg, "nOwnership of this tree has been given to the provider.  You cannot free the tree.");
  550. break;
  551. case DB_E_COSTLIMIT :
  552. strcat(msg, "nUnable to find a query plan within the given cost limit");
  553. break;
  554. case DB_E_GOALREJECTED :
  555. strcat(msg, "nNo nonzero weights specified for any goals supported, so goal was rejected; current goal was not changed.");
  556. break;
  557. case DB_E_INVALIDTRANSITION :
  558. strcat(msg, "nA transition from ALL* to MOVE* or EXTEND* was specified.");
  559. break;
  560. case DB_E_LIMITREJECTED :
  561. strcat(msg, "nSome cost limits were rejected.");
  562. break;
  563. case DB_E_NONCONTIGUOUSRANGE :
  564. strcat(msg, "nThe specified set of rows was not contiguous to or overlapping the rows in the specified watch region.");
  565. break;
  566. case DB_S_ERRORSINTREE :
  567. strcat(msg, "nErrors found in validating tree.");
  568. break;
  569. case DB_S_GOALCHANGED :
  570. strcat(msg, "nSpecified weight was not supported or exceeded the supported limit and was set to 0 or the supported limit.");
  571. break;
  572. case DB_S_TOOMANYCHANGES :
  573. strcat(msg, "nThe provider was unable to keep track of all the changes. You must refetch the data associated with the watch region using another method.");
  574. break;
  575. #endif //OLEDBVER >= 0x0250
  576. // BLOB ISequentialStream errors
  577. case STG_E_INVALIDFUNCTION :
  578. strcat(msg, "nYou tried an invalid function.");
  579. break;
  580. case S_FALSE :
  581. strcat(msg, "nS_FALSE was returned.  The ISequentialStream data could not be read from the stream object.");
  582. break;
  583. case E_PENDING :
  584. strcat(msg, "nAsynchronous Storage only: Part or all of the data to be written is currently unavailable. For more information, see IFillLockBytes and Asynchronous Storage in MSDN.");
  585. break;
  586. case STG_E_MEDIUMFULL :
  587. strcat(msg, "nThe write operation was not completed because there is no space left on the storage device.");
  588. break;
  589. case STG_E_ACCESSDENIED :
  590. strcat(msg, "nThe caller does not have sufficient permissions for writing this stream object.");
  591. break;
  592. case STG_E_CANTSAVE :
  593. strcat(msg, "nData cannot be written for reasons other than lack of access or space.");
  594. break;
  595. case STG_E_INVALIDPOINTER :
  596. strcat(msg, "nOne of the pointer values is invalid.");
  597. break;
  598. case STG_E_REVERTED :
  599. strcat(msg, "nThe object has been invalidated by a revert operation above it in the transaction tree.");
  600. break;
  601. case STG_E_WRITEFAULT :
  602. strcat(msg, "nThe write operation was not completed due to a disk error.");
  603. break;
  604. // Unknown error
  605. default :
  606. strcat(msg, "nHRESULT returned an unknown error.");
  607. break;
  608. }
  609. }
  610. };
  611. #endif // !defined(Chucks_Error_Routine_Included)