Example #1
0
        // Send results from SqlDataReader
        public void Send(SqlDataReader reader)
        {
            ADP.CheckArgumentNull(reader, "reader");

            SetPipeBusy( );
            try {
                EnsureNormalSendValid("Send");
                do
                {
                    SmiExtendedMetaData[] columnMetaData = reader.GetInternalSmiMetaData();

                    if (null != columnMetaData && 0 != columnMetaData.Length)   // SQLBUDT #340528 -- don't send empty results.
                    {
                        using (SmiRecordBuffer recordBuffer = _smiContext.CreateRecordBuffer(columnMetaData, _eventSink)) {
                            _eventSink.ProcessMessagesAndThrow(); // Handle any errors that are reported.


                            _smiContext.SendResultsStartToPipe(recordBuffer, _eventSink);
                            _eventSink.ProcessMessagesAndThrow(); // Handle any errors that are reported.

                            try {
                                while (reader.Read( ))
                                {
                                    if (SmiContextFactory.Instance.NegotiatedSmiVersion >= SmiContextFactory.KatmaiVersion)
                                    {
                                        ValueUtilsSmi.FillCompatibleSettersFromReader(_eventSink, recordBuffer, new List <SmiExtendedMetaData>(columnMetaData), reader);
                                    }
                                    else
                                    {
                                        ValueUtilsSmi.FillCompatibleITypedSettersFromReader(_eventSink, recordBuffer, columnMetaData, reader);
                                    }

                                    _smiContext.SendResultsRowToPipe(recordBuffer, _eventSink);
                                    _eventSink.ProcessMessagesAndThrow(); // Handle any errors that are reported.
                                }
                            }
                            finally {
                                _smiContext.SendResultsEndToPipe(recordBuffer, _eventSink);
                                _eventSink.ProcessMessagesAndThrow(); // Handle any errors that are reported.
                            }
                        }
                    }
                }while (reader.NextResult( ));
            }
            catch {
                _eventSink.CleanMessages();
                throw;
            }
            finally {
                ClearPipeBusy( );
                Debug.Assert(_eventSink.HasMessages == false, "There should be no messages left in _eventsink at the end of the Send reader!");
            }
        }