/// <summary> /// Performs the actual reading and converting /// NOTE: This assumes that buffer, index and count are all valid, we're not closed (!IsClosed) and that there is data left (IsDataLeft()) /// </summary> /// <param name="buffer"></param> /// <param name="index"></param> /// <param name="count"></param> /// <returns></returns> private int InternalRead(char[] buffer, int index, int count) { Debug.Assert(buffer != null, "Null output buffer"); Debug.Assert((index >= 0) && (count >= 0) && (index + count <= buffer.Length), string.Format("Bad count: {0} or index: {1}", count, index)); Debug.Assert(!IsClosed, "Can't read while textreader is closed"); try { int byteBufferUsed; byte[] byteBuffer = PrepareByteBuffer(count, out byteBufferUsed); byteBufferUsed += _reader.GetBytesInternalSequential(_columnIndex, byteBuffer, byteBufferUsed, byteBuffer.Length - byteBufferUsed); if (byteBufferUsed > 0) { return(DecodeBytesToChars(byteBuffer, byteBufferUsed, buffer, index, count)); } else { // Nothing to read, or nothing read return(0); } } catch (SqlException ex) { // Read can't throw a SqlException - so wrap it in an IOException throw ADP.ErrorReadingFromStream(ex); } }
public override int Read(byte[] buffer, int offset, int count) { ValidateReadParameters(buffer, offset, count); if (!CanRead) { throw ADP.ObjectDisposed(this); } if (_currentTask != null) { throw ADP.AsyncOperationPending(); } try { return(_reader.GetBytesInternalSequential(_columnIndex, buffer, offset, count, _readTimeout)); } catch (SqlException ex) { // Stream.Read() can't throw a SqlException - so wrap it in an IOException throw ADP.ErrorReadingFromStream(ex); } }