The code in this example shows how to process the contents of an error record.
//////////////////////////////////////////////////////////////////////// // myDisplayErrorRecord // // This function displays the error information for a single error // record, including information from ISQLErrorInfo, if supported. // //////////////////////////////////////////////////////////////////////// HRESULT myDisplayErrorRecord ( HRESULT hrReturned, ULONG iRecord, IErrorRecords * pIErrorRecords, LPCWSTR pwszFile, ULONG ulLine) { HRESULT hr; IErrorInfo * pIErrorInfo = NULL; BSTR bstrDescription = NULL; BSTR bstrSource = NULL; BSTR bstrSQLInfo = NULL; static LCID lcid = GetUserDefaultLCID(); LONG lNativeError = 0; ERRORINFO ErrorInfo; // Get the IErrorInfo interface pointer for this error record. CHECK_HR(hr = pIErrorRecords->GetErrorInfo(iRecord, lcid, &pIErrorInfo)); // Get the description of this error. CHECK_HR(hr = pIErrorInfo->GetDescription(&bstrDescription)); // Get the source of this error. CHECK_HR(hr = pIErrorInfo->GetSource(&bstrSource)); // Get the basic error information for this record. CHECK_HR(hr = pIErrorRecords->GetBasicErrorInfo(iRecord, &ErrorInfo)); // If the error object supports ISQLErrorInfo, get this information. myGetSqlErrorInfo(iRecord, pIErrorRecords, &bstrSQLInfo, &lNativeError); // Display the error information to the user. if( bstrSQLInfo ) { wprintf(L"\nErrorRecord: HResult: 0x%08x\nDescription: %s\n" L"SQLErrorInfo: %s\nSource: %s\nFile: %s, Line: %d\n", ErrorInfo.hrError, bstrDescription, bstrSQLInfo, bstrSource, pwszFile, ulLine); } else { wprintf(L"\nErrorRecord: HResult: 0x%08x\nDescription: %s\n" L"Source: %s\nFile: %s, Line: %d\n", ErrorInfo.hrError, bstrDescription, bstrSource, pwszFile, ulLine); } CLEANUP: if( pIErrorInfo ) pIErrorInfo->Release(); SysFreeString(bstrDescription); SysFreeString(bstrSource); SysFreeString(bstrSQLInfo); return hr; } //////////////////////////////////////////////////////////////////////// // myDisplayErrorInfo // // This function displays basic error information for an error object // that doesn't support the IErrorRecords interface. // //////////////////////////////////////////////////////////////////////// HRESULT myDisplayErrorInfo ( HRESULT hrReturned, IErrorInfo * pIErrorInfo, LPCWSTR pwszFile, ULONG ulLine) { HRESULT hr; BSTR bstrDescription = NULL; BSTR bstrSource = NULL; // Get the description of the error. CHECK_HR(hr = pIErrorInfo->GetDescription(&bstrDescription)); // Get the source of the error--this will be the window title. CHECK_HR(hr = pIErrorInfo->GetSource(&bstrSource)); // Display this error information. wprintf(L"\nErrorInfo: HResult: 0x%08x, Description: %s\nSource: %s\n" L"File: %s, Line: %d\n", hrReturned, bstrDescription, bstrSource, pwszFile, ulLine); CLEANUP: SysFreeString(bstrDescription); SysFreeString(bstrSource); return hr; } //////////////////////////////////////////////////////////////////////// // myGetSqlErrorInfo // // If the error object supports ISQLErrorInfo, get the SQL error // string and native error code for this error. // //////////////////////////////////////////////////////////////////////// HRESULT myGetSqlErrorInfo ( ULONG iRecord, IErrorRecords * pIErrorRecords, BSTR * pBstr, LONG * plNativeError ) { HRESULT hr; ISQLErrorInfo * pISQLErrorInfo = NULL; LONG lNativeError = 0; // Attempt to get the ISQLErrorInfo interface for this error // record through GetCustomErrorObject. Note that ISQLErrorInfo // is not mandatory, so failure is acceptable here. CHECK_HR(hr = pIErrorRecords->GetCustomErrorObject( iRecord, // iRecord IID_ISQLErrorInfo, // riid (IUnknown**)&pISQLErrorInfo)); // ppISQLErrorInfo // If we obtained the ISQLErrorInfo interface, get the SQL // error string and native error code for this error. if( pISQLErrorInfo ) hr = pISQLErrorInfo->GetSQLInfo(pBstr, &lNativeError); CLEANUP: if( plNativeError ) *plNativeError = lNativeError; if( pISQLErrorInfo ) pISQLErrorInfo->Release(); return hr; }