protected override async Task EmitBatchAsync(IEnumerable <RequestEntry> events) { var list = events as IList <RequestEntry> ?? events.ToList(); this.Fill(list); using (var connection = new SqlConnection(_options.ConnectionString)) { connection.Open(); using (var copy = new SqlBulkCopy(connection)) { copy.DestinationTableName = string.Format(_options.RequestsTableName); foreach (var column in _eventsTable.Columns) { var columnName = ((DataColumn)column).ColumnName; var mapping = new SqlBulkCopyColumnMapping(columnName, columnName); copy.ColumnMappings.Add(mapping); } await copy.WriteToServerAsync(_eventsTable).ConfigureAwait(false); } } _eventsTable.Clear(); await _locations.Append(list.Select(e => e.SourceAddress).Distinct().ToArray()).ConfigureAwait(false); }
/// <summary> /// Emit a batch of log events, running asynchronously. /// </summary> /// <param name="events">The events to emit.</param> /// <remarks> /// Override either <see cref="PeriodicBatchingSink.EmitBatch" /> or <see cref="PeriodicBatchingSink.EmitBatchAsync" /> /// , /// not both. /// </remarks> protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events) { // Copy the events to the data table this.FillDataTable(events); try { using (var cn = new SqlConnection(_connectionString)) { await cn.OpenAsync().ConfigureAwait(false); using (var copy = _columnOptions.DisableTriggers ? new SqlBulkCopy(cn) : new SqlBulkCopy(cn, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers, null) ) { copy.DestinationTableName = _tableName; foreach (var column in _eventsTable.Columns) { var columnName = ((DataColumn)column).ColumnName; var mapping = new SqlBulkCopyColumnMapping(columnName, columnName); copy.ColumnMappings.Add(mapping); } await copy.WriteToServerAsync(_eventsTable).ConfigureAwait(false); } } await _locations.Append(_eventsTable.Rows.OfType <DataRow>().Select(e => e["SourceAddress"].ToString()).Distinct().ToArray()).ConfigureAwait(false); } catch (Exception ex) { SelfLog.WriteLine("Unable to write {0} log events to the database due to following error: {1}", events.Count(), ex.Message); } finally { // Processed the items, clear for the next run _eventsTable.Clear(); } }