/// <summary> /// Ctr. /// </summary> /// <param name="countToRead">Number of <see cref="RowData"/> items to read, can be zero</param> /// <param name="fieldTypes">Expected field types</param> /// <param name="stream">Incoming data stream</param> /// <param name="driverRowData">Buffer to put field values into, after each call to <see cref="MoveNext"/></param> public InputDataStreamEnumerator(int countToRead, DbType[] fieldTypes, Stream stream, DriverRowData driverRowData) { if (countToRead < 0) { throw new ArgumentOutOfRangeException("countToRead", countToRead, "Count may not be negative"); } if (fieldTypes == null) { throw new ArgumentNullException("fieldTypes"); } if (stream == null) { throw new ArgumentNullException("stream"); } if (driverRowData == null) { throw new ArgumentNullException("driverRowData"); } if (fieldTypes.Length == 0) { throw new ArgumentException("Count of fields in client row buffer must be greater than zero, first column must contain primary key value"); } if (driverRowData.FieldTypes.Length != fieldTypes.Length) { throw new ArgumentException(string.Format("Count of fields in client row buffer ({0}) must be equal to count of fields in driver buffer ({1})" , fieldTypes.Length, driverRowData.FieldTypes.Length)); } for (var ordinal = 0; ordinal < driverRowData.FieldTypes.Length; ordinal++) { if (driverRowData.FieldTypes[ordinal] != fieldTypes[ordinal]) { throw new ArgumentException(string.Format("Field type mismatch at ordinal {0}. Client type: {1}, driver type: {2}", ordinal, fieldTypes[ordinal], m_driverRowData.FieldTypes[ordinal])); } } m_countToRead = countToRead; m_driverRowData = driverRowData; m_reader = new BinaryReader(stream, Encoding.UTF8, true); m_readerBuffer = new RowData(fieldTypes); m_pkFieldType = m_readerBuffer.FieldRepresentationTypes[0]; }