示例#1
0
        public void SendResultsStart(SqlDataRecord record)
        {
            ADP.CheckArgumentNull(record, "record");

            SetPipeBusy( );
            try {
                EnsureNormalSendValid("SendResultsStart");

                SmiRecordBuffer recordBuffer = record.RecordBuffer;
                if (record.RecordContext == _smiContext)
                {
                    recordBuffer = record.RecordBuffer;
                }
                else
                {
                    recordBuffer = _smiContext.CreateRecordBuffer(record.InternalGetSmiMetaData(), _eventSink);    // Only MetaData needed for sending start
                }
                _smiContext.SendResultsStartToPipe(recordBuffer, _eventSink);

                // Handle any errors that are reported.
                _eventSink.ProcessMessagesAndThrow();

                // remember sent buffer info so it can be used in send row/end.
                _recordBufferSent = recordBuffer;
                _metaDataSent     = record.InternalGetMetaData();
            }
            catch {
                _eventSink.CleanMessages();
                throw;
            }
            finally {
                ClearPipeBusy( );
                Debug.Assert(_eventSink.HasMessages == false, "There should be no messages left in _eventsink at the end of the SendResultsStart!");
            }
        }
 public void SendResultsStart(SqlDataRecord record)
 {
     ADP.CheckArgumentNull(record, "record");
     this.SetPipeBusy();
     try
     {
         this.EnsureNormalSendValid("SendResultsStart");
         SmiRecordBuffer recordBuffer = record.RecordBuffer;
         if (record.RecordContext == this._smiContext)
         {
             recordBuffer = record.RecordBuffer;
         }
         else
         {
             recordBuffer = this._smiContext.CreateRecordBuffer(record.InternalGetSmiMetaData(), this._eventSink);
         }
         this._smiContext.SendResultsStartToPipe(recordBuffer, this._eventSink);
         this._eventSink.ProcessMessagesAndThrow();
         this._recordBufferSent = recordBuffer;
         this._metaDataSent     = record.InternalGetMetaData();
     }
     finally
     {
         this.ClearPipeBusy();
     }
 }
示例#3
0
        public void Send(SqlDataRecord record)
        {
            ADP.CheckArgumentNull(record, "record");

            SetPipeBusy( );
            try {
                EnsureNormalSendValid("Send");

                if (0 != record.FieldCount)   // SQLBUDT #340564 -- don't send empty records.

                {
                    SmiRecordBuffer recordBuffer;
                    if (record.RecordContext == _smiContext)
                    {
                        recordBuffer = record.RecordBuffer;
                    }
                    else        // SendResultsRowToPipe() only takes a RecordBuffer created by an SmiContext
                    {
                        SmiExtendedMetaData[] columnMetaData = record.InternalGetSmiMetaData();
                        recordBuffer = _smiContext.CreateRecordBuffer(columnMetaData, _eventSink);
                        if (SmiContextFactory.Instance.NegotiatedSmiVersion >= SmiContextFactory.KatmaiVersion)
                        {
                            ValueUtilsSmi.FillCompatibleSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record, null /* no default values */);
                        }
                        else
                        {
                            ValueUtilsSmi.FillCompatibleITypedSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record);
                        }
                    }

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

                    //  If SendResultsStartToPipe succeeded, then SendResultsEndToPipe must be called.
                    try {
                        _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.
                    }
                }
            }
            catch {
                // VSDD 479525: if exception happens (e.g. SendResultsStartToPipe throw OutOfMemory), _eventSink may not be empty,
                // which will affect server's behavior if the next call successes (previous exception is still in the eventSink,
                // will be throwed). So we need to clean _eventSink.
                _eventSink.CleanMessages();
                throw;
            }
            finally {
                ClearPipeBusy( );
                Debug.Assert(_eventSink.HasMessages == false, "There should be no messages left in _eventsink at the end of the Send record!");
            }
        }
示例#4
0
        public void SendResultsRow(SqlDataRecord record)
        {
            ADP.CheckArgumentNull(record, "record");

            SetPipeBusy( );
            try {
                EnsureResultStarted("SendResultsRow");

                if (_hadErrorInResultSet)
                {
                    throw SQL.SqlPipeErrorRequiresSendEnd();
                }

                // Assume error state unless cleared below
                _hadErrorInResultSet = true;

                SmiRecordBuffer recordBuffer;
                if (record.RecordContext == _smiContext)
                {
                    recordBuffer = record.RecordBuffer;
                }
                else
                {
                    SmiExtendedMetaData[] columnMetaData = record.InternalGetSmiMetaData();
                    recordBuffer = _smiContext.CreateRecordBuffer(columnMetaData, _eventSink);
                    if (SmiContextFactory.Instance.NegotiatedSmiVersion >= SmiContextFactory.KatmaiVersion)
                    {
                        ValueUtilsSmi.FillCompatibleSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record, null /* no default values */);
                    }
                    else
                    {
                        ValueUtilsSmi.FillCompatibleITypedSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record);
                    }
                }
                _smiContext.SendResultsRowToPipe(recordBuffer, _eventSink);

                // Handle any errors that are reported.
                _eventSink.ProcessMessagesAndThrow();

                // We successfully traversed the send, clear error state
                _hadErrorInResultSet = false;
            }
            catch {
                _eventSink.CleanMessages();
                throw;
            }
            finally {
                ClearPipeBusy( );
                Debug.Assert(_eventSink.HasMessages == false, "There should be no messages left in _eventsink at the end of the SendResultsRow!");
            }
        }
 public void Send(SqlDataRecord record)
 {
     ADP.CheckArgumentNull(record, "record");
     this.SetPipeBusy();
     try
     {
         this.EnsureNormalSendValid("Send");
         if (record.FieldCount != 0)
         {
             SmiRecordBuffer recordBuffer;
             if (record.RecordContext == this._smiContext)
             {
                 recordBuffer = record.RecordBuffer;
             }
             else
             {
                 SmiExtendedMetaData[] smiMetaData = record.InternalGetSmiMetaData();
                 recordBuffer = this._smiContext.CreateRecordBuffer(smiMetaData, this._eventSink);
                 if (SmiContextFactory.Instance.NegotiatedSmiVersion >= 210L)
                 {
                     ValueUtilsSmi.FillCompatibleSettersFromRecord(this._eventSink, recordBuffer, smiMetaData, record, null);
                 }
                 else
                 {
                     ValueUtilsSmi.FillCompatibleITypedSettersFromRecord(this._eventSink, recordBuffer, smiMetaData, record);
                 }
             }
             this._smiContext.SendResultsStartToPipe(recordBuffer, this._eventSink);
             this._eventSink.ProcessMessagesAndThrow();
             try
             {
                 this._smiContext.SendResultsRowToPipe(recordBuffer, this._eventSink);
                 this._eventSink.ProcessMessagesAndThrow();
             }
             finally
             {
                 this._smiContext.SendResultsEndToPipe(recordBuffer, this._eventSink);
                 this._eventSink.ProcessMessagesAndThrow();
             }
         }
     }
     finally
     {
         this.ClearPipeBusy();
     }
 }
 public void SendResultsRow(SqlDataRecord record)
 {
     ADP.CheckArgumentNull(record, "record");
     this.SetPipeBusy();
     try
     {
         SmiRecordBuffer recordBuffer;
         this.EnsureResultStarted("SendResultsRow");
         if (this._hadErrorInResultSet)
         {
             throw SQL.SqlPipeErrorRequiresSendEnd();
         }
         this._hadErrorInResultSet = true;
         if (record.RecordContext == this._smiContext)
         {
             recordBuffer = record.RecordBuffer;
         }
         else
         {
             SmiExtendedMetaData[] smiMetaData = record.InternalGetSmiMetaData();
             recordBuffer = this._smiContext.CreateRecordBuffer(smiMetaData, this._eventSink);
             if (SmiContextFactory.Instance.NegotiatedSmiVersion >= 210L)
             {
                 ValueUtilsSmi.FillCompatibleSettersFromRecord(this._eventSink, recordBuffer, smiMetaData, record, null);
             }
             else
             {
                 ValueUtilsSmi.FillCompatibleITypedSettersFromRecord(this._eventSink, recordBuffer, smiMetaData, record);
             }
         }
         this._smiContext.SendResultsRowToPipe(recordBuffer, this._eventSink);
         this._eventSink.ProcessMessagesAndThrow();
         this._hadErrorInResultSet = false;
     }
     finally
     {
         this.ClearPipeBusy();
     }
 }
示例#7
0
        public void SendResultsRow( SqlDataRecord record ) {
            ADP.CheckArgumentNull(record, "record");

            SetPipeBusy( );
            try {
                EnsureResultStarted( "SendResultsRow" );

                if ( _hadErrorInResultSet ) {
                    throw SQL.SqlPipeErrorRequiresSendEnd();
                }

                // Assume error state unless cleared below
                _hadErrorInResultSet = true;

                SmiRecordBuffer recordBuffer;
                if (record.RecordContext == _smiContext) {
                    recordBuffer = record.RecordBuffer;
                } else {
                    SmiExtendedMetaData[] columnMetaData = record.InternalGetSmiMetaData();
                    recordBuffer = _smiContext.CreateRecordBuffer(columnMetaData, _eventSink);
                    if (SmiContextFactory.Instance.NegotiatedSmiVersion >= SmiContextFactory.KatmaiVersion) {
                        ValueUtilsSmi.FillCompatibleSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record, null /* no default values */);
                    }
                    else {
                        ValueUtilsSmi.FillCompatibleITypedSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record);
                    }
                }
                _smiContext.SendResultsRowToPipe( recordBuffer, _eventSink );

                // Handle any errors that are reported.
                _eventSink.ProcessMessagesAndThrow();

                // We successfully traversed the send, clear error state
                _hadErrorInResultSet = false;
            }
            catch {
                _eventSink.CleanMessages();
                throw;
            }
            finally {
                ClearPipeBusy( );
                Debug.Assert(_eventSink.HasMessages == false, "There should be no messages left in _eventsink at the end of the SendResultsRow!");
            }
        }
示例#8
0
        public void SendResultsStart( SqlDataRecord record ) {
            ADP.CheckArgumentNull(record, "record");

            SetPipeBusy( );
            try {
                EnsureNormalSendValid( "SendResultsStart" );

                SmiRecordBuffer recordBuffer = record.RecordBuffer;
                if (record.RecordContext == _smiContext) {
                    recordBuffer = record.RecordBuffer;
                } else {
                    recordBuffer = _smiContext.CreateRecordBuffer(record.InternalGetSmiMetaData(), _eventSink);    // Only MetaData needed for sending start
                }
                _smiContext.SendResultsStartToPipe( recordBuffer, _eventSink );

                // Handle any errors that are reported.
                _eventSink.ProcessMessagesAndThrow();

                // remember sent buffer info so it can be used in send row/end.
                _recordBufferSent = recordBuffer;
                _metaDataSent = record.InternalGetMetaData();
            }
            catch {
                _eventSink.CleanMessages();
                throw;
            }
            finally {
                ClearPipeBusy( );
                Debug.Assert(_eventSink.HasMessages == false, "There should be no messages left in _eventsink at the end of the SendResultsStart!");
            }
        }
示例#9
0
        public void Send( SqlDataRecord record ) {
            ADP.CheckArgumentNull(record, "record");

            SetPipeBusy( );
            try {
                EnsureNormalSendValid( "Send" );

                if (0 != record.FieldCount) { // SQLBUDT #340564 -- don't send empty records.
                
                    SmiRecordBuffer recordBuffer;
                    if (record.RecordContext == _smiContext) {
                        recordBuffer = record.RecordBuffer;
                    } else {    // SendResultsRowToPipe() only takes a RecordBuffer created by an SmiContext
                        SmiExtendedMetaData[] columnMetaData = record.InternalGetSmiMetaData();
                        recordBuffer = _smiContext.CreateRecordBuffer(columnMetaData, _eventSink);
                        if (SmiContextFactory.Instance.NegotiatedSmiVersion >= SmiContextFactory.KatmaiVersion) {
                            ValueUtilsSmi.FillCompatibleSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record, null /* no default values */);
                        }
                        else {
                            ValueUtilsSmi.FillCompatibleITypedSettersFromRecord(_eventSink, recordBuffer, columnMetaData, record);
                        }
                    }

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

                    //  If SendResultsStartToPipe succeeded, then SendResultsEndToPipe must be called.
                    try {
                        _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.
                    }
                }
            }
            catch {
                // VSDD 479525: if exception happens (e.g. SendResultsStartToPipe throw OutOfMemory), _eventSink may not be empty,
                // which will affect server's behavior if the next call successes (previous exception is still in the eventSink, 
                // will be throwed). So we need to clean _eventSink.
                _eventSink.CleanMessages();
                throw;
            }
            finally {
                ClearPipeBusy( );
                Debug.Assert(_eventSink.HasMessages == false, "There should be no messages left in _eventsink at the end of the Send record!");
            }
        }