public void WriteTo(Stream stream) { if (m_dataRequest == null) { throw new InvalidOperationException("Cannot write when not attached to a command"); } // write headers m_dataRequest.HaveRequestBulk = m_dataRequestBulk != null; m_dataRequest.HaveParameters = m_dataRequestParams != null && m_dataRequestParams.DataTypes.Length > 0; Serializer.SerializeWithLengthPrefix(stream, m_dataRequest, PrefixStyle.Base128); // write parameters if (m_dataRequest.HaveParameters) { Serializer.SerializeWithLengthPrefix(stream, m_dataRequestParams, PrefixStyle.Base128); m_stream.SetLength(0); using (var bufferWriter = new BinaryWriter(m_stream, Encoding.UTF8, true)) using (var outputWriter = new BinaryWriter(stream, Encoding.UTF8, true)) { // write notnull flags var notnulls = new int[BitVector.GetArrayLength(m_dataRequestParams.Bulk.ParametersData.Count)]; for (var i = 0; i < m_dataRequestParams.Bulk.ParametersData.Count; i++) { var param = m_dataRequestParams.Bulk.ParametersData[i]; if (param.Value != null && param.Value != DBNull.Value) { BitVector.Set(notnulls, i); } } BitVector.Write(notnulls, m_dataRequestParams.Bulk.ParametersData.Count, bufferWriter); // write parameter data for (var ordinal = 0; ordinal < m_dataRequestParams.Bulk.ParametersData.Count; ordinal++) { if (BitVector.Get(notnulls, ordinal)) { var param = m_dataRequestParams.Bulk.ParametersData[ordinal]; param.Write(bufferWriter); } if (m_stream.Length > 1000000) { BufferedReaderStream.WriteBlock(outputWriter, m_stream); m_stream.SetLength(0); } } if (m_stream.Length > 0) { BufferedReaderStream.WriteBlock(outputWriter, m_stream); m_stream.SetLength(0); } BufferedReaderStream.WriteStreamEndMarker(outputWriter); } } // write data for bulk operation if (m_dataRequest.HaveRequestBulk) { Serializer.SerializeWithLengthPrefix(stream, m_dataRequestBulk, PrefixStyle.Base128); m_stream.SetLength(0); using (var bufferWriter = new BinaryWriter(m_stream, Encoding.UTF8, true)) using (var outputWriter = new BinaryWriter(stream, Encoding.UTF8, true)) { foreach (var row in m_dataRequestBulk.Bulk) { row.Write(bufferWriter); if (m_stream.Length > 1000000) { BufferedReaderStream.WriteBlock(outputWriter, m_stream); m_stream.SetLength(0); } } if (m_stream.Length > 0) { BufferedReaderStream.WriteBlock(outputWriter, m_stream); m_stream.SetLength(0); } BufferedReaderStream.WriteStreamEndMarker(outputWriter); } } }