Example #1
0
        private bool ReadMessageBatch(SqlConnection connection)
        {
            if (SupportsNotify)
            {
                return(ReadNotifyMessages(connection));
            }

            var messages = new EventMessages();

            using (var command = new SqlCommand(Sql.GetMessageRange, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                // The stored procedure takes a time (in ticks) as parameter instead of message ID, because
                // messages in the database are not necessarily ordered by ID.

                command.Parameters.Add("@fromTime", SqlDbType.BigInt).Value   = _lastReadMessageTime;
                command.Parameters.Add("@afterSequence", SqlDbType.Int).Value = _lastReadMessageSequence;

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        _lastReadMessageTime     = reader.GetInt64(1);
                        _lastReadMessageSequence = reader.GetInt32(2);

                        var    time         = new System.DateTime(_lastReadMessageTime);
                        string exceptionXml = (reader.IsDBNull(8) ? null : reader.GetString(8));

                        var message = new SqlEventMessage(this, reader.GetInt32(0),
                                                          reader.GetString(4), reader.GetString(3), reader.GetString(5), reader.GetString(6),
                                                          reader.GetString(7), time, exceptionXml);
                        message.Intern(_interner);
                        SetMessageSequence(message, _lastReadMessageSequence);

                        messages.Add(message);
                    }
                }
            }

            // Note that the messages don't have parameters or details at this stage - those will be read as needed.

            if (messages.Count > 0)
            {
                _raiseExistingRead = true;                 // We have more messages.
                HandleEventMessages(messages);
                return(true);
            }

            if (_raiseExistingRead)
            {
                _raiseExistingRead = false;         // Don't raise again until we've read some messages.
                OnExistingMessagesRead(System.EventArgs.Empty);
            }

            return(false);
        }
Example #2
0
        private SqlEventMessage ReadMessage(IDataRecord reader)
        {
            var    time         = new System.DateTime(reader.GetInt64(1));
            string exceptionXml = (reader.IsDBNull(8) ? null : reader.GetString(8));

            var message = new SqlEventMessage(this, reader.GetInt32(0),
                                              reader.GetString(4), reader.GetString(3),
                                              reader.GetString(5), reader.GetString(6),
                                              reader.GetString(7), time, exceptionXml);

            message.Intern(_interner);
            SetMessageSequence(message, reader.GetInt32(2));

            return(message);
        }
Example #3
0
        protected override void ReadAll()
        {
            var messages = new EventMessages();

            using (var connection = new SqlConnection(_connectionString))
            {
                connection.Open();

                using (var command = new SqlCommand(Sql.GetAllMessages, connection))
                {
                    command.CommandType = CommandType.StoredProcedure;

                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var    time         = new System.DateTime(reader.GetInt64(1));
                            string exceptionXml = (reader.IsDBNull(8) ? null : reader.GetString(8));

                            var message = new SqlEventMessage(null, reader.GetInt32(0),
                                                              reader.GetString(4), reader.GetString(3), reader.GetString(5), reader.GetString(6),
                                                              reader.GetString(7), time, exceptionXml);
                            message.Intern(_interner);
                            SetMessageSequence(message, reader.GetInt32(2));

                            messages.Add(message);
                        }
                    }
                }

                // Read the parameters immediately.

                foreach (SqlEventMessage message in messages)
                {
                    message.SetParameters(ReadParameters(connection, message.Id));
                }
            }

            if (messages.Count > 0)
            {
                HandleEventMessages(messages);
            }
        }