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); }
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); }
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); } }