private static OdbcReturnCode GetDiagnosticRecord(OdbcHandle handle, short recordNumber, out string state, StringBuilder messageBuffer, out short bufferLengthNeeded) { var stateBuffer = new StringBuilder(5); int nativeError; var result = NativeMethods.SQLGetDiagRecW(handle.HandleType, handle, recordNumber, stateBuffer, out nativeError, messageBuffer, (short)messageBuffer.Capacity, out bufferLengthNeeded); if ((result == OdbcReturnCode.Success) || (result == OdbcReturnCode.SuccessWithInfo)) { state = stateBuffer.ToString(); } else { state = null; } return result; }
internal static extern OdbcReturnCode SQLGetDiagRecW(OdbcHandleType handleType, OdbcHandle handle, short recordNumber, StringBuilder stateBuffer, out int nativeError, StringBuilder messageBuffer, short bufferLength, out short bufferLengthNeeded);
internal static Exception GetException(OdbcHandle handle, string message) { var errors = new List<OdbcError>(); var messageBuffer = new StringBuilder(512); short recordNumber = 1; while (true) { string state; short bufferLengthNeeded; var result = GetDiagnosticRecord(handle, recordNumber, out state, messageBuffer, out bufferLengthNeeded); if (result == OdbcReturnCode.SuccessWithInfo) { var neededCapacity = bufferLengthNeeded + 1; if (messageBuffer.Capacity < neededCapacity) { messageBuffer.Capacity = neededCapacity; result = GetDiagnosticRecord(handle, recordNumber, out state, messageBuffer, out bufferLengthNeeded); } } if ((result != OdbcReturnCode.Success) && (result != OdbcReturnCode.SuccessWithInfo)) { break; } errors.Add(new OdbcError(state, messageBuffer.ToString())); recordNumber++; } return CreateException(message, errors); }