internal static string RetcodeToString(SQLRETURN retcode) { switch (retcode) { case SQLRETURN.SUCCESS: return("SUCCESS"); case SQLRETURN.SUCCESS_WITH_INFO: return("SUCCESS_WITH_INFO"); case SQLRETURN.ERROR: return("ERROR"); case SQLRETURN.INVALID_HANDLE: return("INVALID_HANDLE"); case SQLRETURN.NO_DATA: return("NO_DATA"); default: Debug.Fail("Unknown enumerator passed to RetcodeToString method"); goto case SQLRETURN.ERROR; } }
internal static void GetDiagErrors(OdbcErrorCollection errors, string?source, OdbcHandle hrHandle, SQLRETURN retcode) { Debug.Assert(retcode != ODBC32.SQLRETURN.INVALID_HANDLE, "retcode must never be ODBC32.RetCode.INVALID_HANDLE"); if (SQLRETURN.SUCCESS != retcode) { int NativeError; short iRec = 0; short cchActual; StringBuilder message = new StringBuilder(1024); string sqlState; bool moreerrors = true; while (moreerrors) { ++iRec; retcode = hrHandle.GetDiagnosticRecord(iRec, out sqlState, message, out NativeError, out cchActual); if ((SQLRETURN.SUCCESS_WITH_INFO == retcode) && (message.Capacity - 1 < cchActual)) { message.Capacity = cchActual + 1; retcode = hrHandle.GetDiagnosticRecord(iRec, out sqlState, message, out NativeError, out _); } //Note: SUCCESS_WITH_INFO from SQLGetDiagRec would be because //the buffer is not large enough for the error string. moreerrors = (retcode == SQLRETURN.SUCCESS || retcode == SQLRETURN.SUCCESS_WITH_INFO); if (moreerrors) { //Sets up the InnerException as well... errors.Add(new OdbcError( source, message.ToString(), sqlState, NativeError ) ); } } } }
// Helpers internal static OdbcErrorCollection GetDiagErrors(string?source, OdbcHandle hrHandle, SQLRETURN retcode) { OdbcErrorCollection errors = new OdbcErrorCollection(); GetDiagErrors(errors, source, hrHandle, retcode); return(errors); }