internal EduHubSqlServerWriteResult(IEduHubDataSet DataSet, EduHubSqlServerWriteMode Mode, DateTime Timestamp, DateTime LastModified) { this.DataSet = DataSet; this.Mode = Mode; this.Timestamp = Timestamp; this.LastModified = LastModified; }
internal EduHubSqlServerWriteResult(IEduHubDataSet DataSet, EduHubSqlServerWriteMode Mode, DateTime Timestamp, DateTime LastModified, DateTime? EntityLastModifiedMax, int EntitiesDeleted, int EntitiesUpdated, int EntitiesAdded) : this(DataSet, Mode, Timestamp, LastModified) { this.EntityLastModifiedMax = EntityLastModifiedMax; this.EntitiesDeleted = EntitiesDeleted; this.EntitiesUpdated = EntitiesUpdated; this.EntitiesAdded = EntitiesAdded; }
internal EduHubSqlServerWriteResult(IEduHubDataSet DataSet, EduHubSqlServerWriteMode Mode, DateTime Timestamp, DateTime LastModified, DateTime?EntityLastModifiedMax, int EntitiesDeleted, int EntitiesUpdated, int EntitiesAdded) : this(DataSet, Mode, Timestamp, LastModified) { this.EntityLastModifiedMax = EntityLastModifiedMax; this.EntitiesDeleted = EntitiesDeleted; this.EntitiesUpdated = EntitiesUpdated; this.EntitiesAdded = EntitiesAdded; }
private async Task <EduHubSqlServerWriteResult> WriteToSqlServerDelta(SqlConnection Connection, EduHubSqlServerWriteMode Mode, List <T> Entities, Action <double, string> ProgressNotification) { DateTime timestamp = DateTime.Now; DateTime lastModified = LastModified; int entitiesUpdated = 0; int entitiesAdded; DateTime?entityLastModifiedMax; // Create transaction using (var transaction = Connection.BeginTransaction(IsolationLevel.Serializable)) { ProgressNotification?.Invoke(30, "Removing updated records from the database table"); // Delete Entities (based on Unique fields) // Batches of 100 var batchCount = Math.Ceiling(Entities.Count / 100d); for (int batch = 0; batch < batchCount; batch++) { var batchEntities = Entities.Skip(batch * 100).Take(100); using (var deleteCommand = GetSqlDeleteCommand(Connection, batchEntities)) { deleteCommand.Transaction = transaction; entitiesUpdated += await deleteCommand.ExecuteNonQueryAsync(); } ProgressNotification?.Invoke(30 + ((batch / batchCount) * 0.3), $"Removed {entitiesUpdated} updated records from the database table"); // 30% + 30% Weight } // Bulk Copy Delta Entities using (var bulkCopy = new SqlBulkCopy(Connection, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.TableLock, transaction)) { bulkCopy.DestinationTableName = Name; bulkCopy.EnableStreaming = true; bulkCopy.BulkCopyTimeout = 60 * 2; // 2 Minutes bulkCopy.NotifyAfter = 2000; bulkCopy.BatchSize = 2000; using (var dataReader = GetDataSetDataReader(Entities)) { if (ProgressNotification != null) { bulkCopy.SqlRowsCopied += (sender, e) => { ProgressNotification(60 + (dataReader.Progress * .35), $"Written {e.RowsCopied} records to the database table"); // 60% + 35% Weight }; ProgressNotification(60, "Writing delta records to the database table"); } await bulkCopy.WriteToServerAsync(dataReader); ProgressNotification?.Invoke(95, $"Wrote {dataReader.EntitiesRead} delta records to the database table"); entitiesAdded = dataReader.EntitiesRead; entityLastModifiedMax = dataReader.EntityLastModifiedMax; } } transaction.Commit(); } ProgressNotification?.Invoke(100, $"Successfully wrote the delta data set to the database table"); return(new EduHubSqlServerWriteResult( DataSet: this, Mode: Mode, Timestamp: timestamp, LastModified: lastModified, EntityLastModifiedMax: entityLastModifiedMax, EntitiesDeleted: 0, EntitiesUpdated: entitiesUpdated, EntitiesAdded: entitiesAdded - entitiesUpdated)); }