Exemple #1
0
        public async Task BeginTransactionAsync()
        {
            /*~~~~~~~~~~~~~~~ SQL SERVER ~~~~~~~~~~~~~~~*/
            /* Dispose */
            if (_transaction != null)
            {
                await _transaction.RollbackAsync();

                await _transaction.DisposeAsync();
            }

            if (_connection != null)
            {
                await _connection.CloseAsync();

                await _connection.DisposeAsync();
            }

            /* Create */
            _connection = new SqlConnection(_config.SqlServerConnectionString);
            await _connection.OpenAsync();

            var dbTransaction = await _connection.BeginTransactionAsync();

            _transaction = (SqlTransaction)dbTransaction;
        }
Exemple #2
0
 /// <summary>
 /// Asynchronously rollbacks active transaction.
 /// </summary>
 public async Task RollBackTransactionAsync()
 {
     if (transaction != null)
     {
         await transaction.RollbackAsync();
     }
 }
Exemple #3
0
        public async Task RollbackAsync_should_rollback_transaction()
        {
            var transaction = NSubstitute.Substitute.For <IDbContextTransaction>();
            var sut         = new SqlTransaction(transaction);
            await sut.RollbackAsync();

            transaction.Received(1).RollbackAsync(Arg.Any <CancellationToken>());
        }
Exemple #4
0
        public async Task <string> ExecSqlAsync(List <ParamSql> lst)
        {
            string result;

            try
            {
                using (this.conn = new SqlConnection(this._connectionString))
                {
                    bool flag = this.conn.State != ConnectionState.Open;
                    if (flag)
                    {
                        await this.conn.OpenAsync();
                    }
                    SqlTransaction sqlTransaction = this.conn.BeginTransaction();
                    try
                    {
                        this.cmd             = new SqlCommand();
                        this.cmd.CommandType = CommandType.Text;
                        this.cmd.Connection  = this.conn;
                        this.cmd.Transaction = sqlTransaction;
                        foreach (ParamSql paramSql in lst)
                        {
                            this.cmd.CommandText = paramSql.Sql;
                            foreach (SqlHelperParameter sqlHelperParameter in paramSql.Params)
                            {
                                this.cmd.Parameters.Add(this.GetParameter(sqlHelperParameter));
                            }
                            await this.cmd.ExecuteNonQueryAsync();
                        }
                        await sqlTransaction.CommitAsync();

                        result = string.Empty;
                    }
                    catch (Exception ex)
                    {
                        await sqlTransaction.RollbackAsync();

                        result = ex.Message;
                    }
                    finally
                    {
                        await sqlTransaction.DisposeAsync();

                        await this.cmd.DisposeAsync();

                        await this.conn.CloseAsync();
                    }
                }
            }
            catch (Exception ex2)
            {
                result = ex2.Message;
            }
            return(result);
        }
Exemple #5
0
        public async Task <string> ExecSqlAsync(ArrayList sqlList)
        {
            string result;

            using (this.conn = new SqlConnection(this._connectionString))
            {
                bool flag = this.conn.State != ConnectionState.Open;
                if (flag)
                {
                    await this.conn.OpenAsync();
                }
                bool flag2 = sqlList.Count == 1;
                if (flag2)
                {
                    result = await this.ExecSqlAsync(sqlList[0].ToString());
                }
                else
                {
                    SqlTransaction sqlTransaction = this.conn.BeginTransaction();
                    try
                    {
                        this.cmd             = new SqlCommand();
                        this.cmd.CommandType = CommandType.Text;
                        this.cmd.Connection  = this.conn;
                        this.cmd.Transaction = sqlTransaction;
                        foreach (object obj in sqlList)
                        {
                            string commandText = (string)obj;
                            this.cmd.CommandText = commandText;
                            await this.cmd.ExecuteNonQueryAsync();
                        }
                        await sqlTransaction.CommitAsync();

                        result = string.Empty;
                    }
                    catch (Exception ex)
                    {
                        await sqlTransaction.RollbackAsync();

                        result = ex.Message;
                    }
                    finally
                    {
                        await sqlTransaction.DisposeAsync();
                    }
                }
            }
            return(result);
        }
        public async Task PopulateAsync(DbSchema[] schemas)
        {
            using (var conn = new SqlConnection(Connection.ConnectionString))
            {
                await conn.OpenAsync();

                this.Logger.Information($"Opened connection to {conn.Database} on {conn.DataSource}");
                using (SqlTransaction tran = conn.BeginTransaction())
                {
                    try
                    {
                        foreach (var schema in schemas)
                        {
                            var cleanCmd = new SqlCommand($"TRUNCATE TABLE {schema.TableName}", conn, tran);

                            await cleanCmd.ExecuteNonQueryAsync();

                            this.Logger.Information($"table {schema.TableName} truncated");
                            using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))
                            {
                                bulkCopy.DestinationTableName = $"[dbo].{schema.TableName}";

                                foreach (var col in schema.Columns)
                                {
                                    bulkCopy.ColumnMappings.Add(col.Name, col.Name);
                                }

                                await bulkCopy.WriteToServerAsync(schema.Records);
                            }
                            this.Logger.Information($"{schema.Records.Rows.Count} records have been imported into {schema.TableName}");
                        }

                        await tran.CommitAsync();

                        this.Logger.Information($"All transactions have been committed.");
                    }
                    catch (Exception ex)
                    {
                        this.Logger.Error(ex, $"An error occured while doing operations.  Rolling back all changes to {conn.Database} on {conn.DataSource}");
                        await tran.RollbackAsync();

                        throw;
                    }
                }
                await conn.CloseAsync();
            }
        }
Exemple #7
0
        public async Task InTransactionAsync(Func <SqlTransaction, Task> executeActions, CancellationToken cancellationToken)
        {
            using var connection = GetConnection();
            SqlTransaction?transaction = null;

            try
            {
                await OpenConnectionAsync(connection, cancellationToken);

                using (transaction = connection.BeginTransaction())
                {
                    await executeActions(transaction);

                    await transaction.CommitAsync(cancellationToken);
                }
            }
            catch (Exception)
            {
                // Attempt to roll back the transaction.

                // TODO: log

                try
                {
                    transaction?.RollbackAsync(cancellationToken);
                }
                catch (InvalidOperationException)
                {
                    // This catch block will handle any errors that may have occurred
                    // on the server that would cause the rollback to fail, such as
                    // a closed connection.

                    // TODO: log
                    // TODO: escalate, notify?
                }

                throw;
            }
        }
        public async Task <StatisticResult> ExecuteAsync(string sqlExpression)
        {
            List <Dictionary <string, object> > results = new List <Dictionary <string, object> >();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(sqlExpression, connection);
                await connection.OpenAsync();

                SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable);
                command.Transaction = transaction;

                try
                {
                    SqlDataReader reader = await command.ExecuteReaderAsync();

                    while (await reader.ReadAsync())
                    {
                        Dictionary <string, object> row = new Dictionary <string, object>();

                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            row.Add(reader.GetName(i), reader.GetValue(i));
                        }

                        results.Add(row);
                    }
                    await reader.CloseAsync();

                    await transaction.CommitAsync();
                }
                catch (Exception)
                {
                    await transaction.RollbackAsync();
                }

                return(new StatisticResult(results));
            }
        }
        public async Task <T> ExecuteSqlCommand <T>(string sqlExpression, Execution <T> executionFunction, params SqlParameter[] parameters)
        {
            SqlCommand command = CreateCommand(sqlExpression, parameters);

            using (SqlConnection connection = command.Connection)
            {
                await connection.OpenAsync();

                SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable);
                command.Transaction = transaction;
                try
                {
                    T item = await executionFunction.Invoke(command);

                    await transaction.CommitAsync();

                    return(item);
                }
                catch (Exception ex)
                {
                    await transaction.RollbackAsync();

                    return(default);
        public async Task BulkInsert(List <LineItemDto> lineItemDtos, DateTime Date, string AccountID)
        {
            try{
                DataTable sourceDt = new DataTable();
                sourceDt.Columns.Add("Date", typeof(DateTime));
                sourceDt.Columns.Add("AccountPayerAccountId", typeof(string));
                sourceDt.Columns.Add("UsageAmount", typeof(decimal));
                sourceDt.Columns.Add("UnblendedRate", typeof(decimal));
                sourceDt.Columns.Add("UnblendedCost", typeof(decimal));
                sourceDt.Columns.Add("UsageStartDate", typeof(DateTime));
                sourceDt.Columns.Add("UsageEndDate", typeof(DateTime));
                sourceDt.Columns.Add("ProductionID", typeof(string));
                sourceDt.Columns.Add("LineItemType", typeof(string));

                foreach (LineItemDto dto in lineItemDtos)
                {
                    DataRow dr = sourceDt.NewRow();
                    dr["Date"] = dto.Date;
                    dr["AccountPayerAccountId"] = dto.UsageAccountId;
                    dr["UsageAmount"]           = dto.UsageAmount;
                    dr["UnblendedRate"]         = dto.UnblendedRate;
                    dr["UnblendedCost"]         = dto.UnblendedCost;
                    dr["UsageStartDate"]        = dto.UsageStartDate;
                    dr["UsageEndDate"]          = dto.UsageEndDate;
                    dr["ProductionID"]          = dto.ProductID;
                    dr["LineItemType"]          = dto.LineItemType;
                    sourceDt.Rows.Add(dr);
                }

                using (SqlConnection con = new SqlConnection(_connection.ConnectionString))
                {
                    con.Open();
                    using (SqlTransaction transaction = con.BeginTransaction())
                    {
                        try{
                            using (var cmd = con.CreateCommand())
                            {
                                cmd.CommandText = $"DELETE FROM LineItems_{Date.Month.ToString().PadLeft(2,'0')} WHERE Date = @Date AND AccountPayerAccountId=@AccountId";
                                cmd.Transaction = transaction;
                                cmd.Parameters.AddWithValue("@Date", Date);
                                cmd.Parameters.AddWithValue("@AccountId", AccountID);
                                await cmd.ExecuteNonQueryAsync();
                            }
                            using (SqlBulkCopy dest = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, transaction))
                            {
                                dest.DestinationTableName = $"dbo.LineItems_{Date.Month.ToString().PadLeft(2,'0')}";
                                dest.ColumnMappings.Add("Date", "Date");
                                dest.ColumnMappings.Add("AccountPayerAccountId", "AccountPayerAccountId");
                                dest.ColumnMappings.Add("UsageAmount", "UsageAmount");
                                dest.ColumnMappings.Add("UnblendedRate", "UnblendedRate");
                                dest.ColumnMappings.Add("UnblendedCost", "UnblendedCost");
                                dest.ColumnMappings.Add("UsageStartDate", "UsageStartDate");
                                dest.ColumnMappings.Add("UsageEndDate", "UsageEndDate");
                                dest.ColumnMappings.Add("ProductionID", "ProductionID");
                                dest.ColumnMappings.Add("LineItemType", "LineItemType");
                                await dest.WriteToServerAsync(sourceDt);
                            }
                            await transaction.CommitAsync();
                        }catch (Exception ex) {
                            await transaction.RollbackAsync();
                        }
                    }
                }
            }catch (Exception ex) {
                _logger.LogError($"Add Production got errors:{ex.Message}");
                throw ex;
            }
        }
 public async Task RollbackAsync()
 {
     await transaction.RollbackAsync();
 }