internal EduHubSqlServerWriteResult(IEduHubDataSet DataSet, EduHubSqlServerWriteMode Mode, DateTime Timestamp, DateTime LastModified)
 {
     this.DataSet = DataSet;
     this.Mode = Mode;
     this.Timestamp = Timestamp;
     this.LastModified = LastModified;
 }
Exemple #2
0
 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;
 }
Exemple #4
0
 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;
 }
Exemple #5
0
        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));
        }