/// <summary>
        /// Execute commands
        /// </summary>
        /// <param name="server">db server</param>
        /// <param name="executeCommands">execute commands</param>
        /// <param name="useTransaction">use transaction</param>
        /// <returns>Return effect data numbers</returns>
        async Task <int> ExecuteCommandAsync(DatabaseServer server, CommandExecuteOptions executeOption, IEnumerable <DatabaseExecuteCommand> executeCommands, bool useTransaction)
        {
            int  resultValue = 0;
            bool success     = true;

            using (var conn = SqlServerFactory.GetConnection(server))
            {
                IDbTransaction transaction = null;
                if (useTransaction)
                {
                    transaction = SqlServerFactory.GetExecuteTransaction(conn, executeOption);
                }
                try
                {
                    foreach (var cmd in executeCommands)
                    {
                        var cmdDefinition      = new CommandDefinition(cmd.CommandText, SqlServerFactory.ConvertCmdParameters(cmd.Parameters), transaction: transaction, commandType: cmd.CommandType, cancellationToken: executeOption?.CancellationToken ?? default);
                        var executeResultValue = await conn.ExecuteAsync(cmdDefinition).ConfigureAwait(false);

                        success      = success && (cmd.ForceReturnValue ? executeResultValue > 0 : true);
                        resultValue += executeResultValue;
                        if (useTransaction && !success)
                        {
                            break;
                        }
                    }
                    if (!useTransaction)
                    {
                        return(resultValue);
                    }
                    if (success)
                    {
                        transaction.Commit();
                    }
                    else
                    {
                        resultValue = 0;
                        transaction.Rollback();
                    }
                    return(resultValue);
                }
                catch (Exception ex)
                {
                    resultValue = 0;
                    transaction?.Rollback();
                    throw ex;
                }
            }
        }
        /// <summary>
        /// Get execute transaction
        /// </summary>
        /// <param name="connection">Connection</param>
        /// <param name="executeOption">Execute option</param>
        /// <returns>Return database transaction</returns>
        public static IDbTransaction GetExecuteTransaction(IDbConnection connection, CommandExecuteOptions executeOption)
        {
            DataIsolationLevel?dataIsolationLevel = executeOption?.IsolationLevel;

            if (!dataIsolationLevel.HasValue)
            {
                dataIsolationLevel = DataManager.GetDataIsolationLevel(DatabaseServerType.SQLServer);
            }
            var systemIsolationLevel = DataManager.GetSystemIsolationLevel(dataIsolationLevel);

            if (connection.State != ConnectionState.Open)
            {
                connection.Open();
            }
            return(systemIsolationLevel.HasValue ? connection.BeginTransaction(systemIsolationLevel.Value) : connection.BeginTransaction());
        }
Exemple #3
0
        /// <summary>
        /// Execute command
        /// </summary>
        /// <param name="executeOption">Execute option</param>
        /// <param name="commands">Commands</param>
        /// <returns>Return effect data numbers</returns>
        public async Task <int> ExecuteAsync(CommandExecuteOptions executeOption, IEnumerable <ICommand> commands)
        {
            if (commands.IsNullOrEmpty())
            {
                return(0);
            }
            Dictionary <string, List <ICommand> > commandGroup = new Dictionary <string, List <ICommand> >();
            Dictionary <string, DatabaseServer>   serverInfos  = new Dictionary <string, DatabaseServer>();

            #region Get database servers

            foreach (var cmd in commands)
            {
                var servers = GetServers(cmd);
                foreach (var server in servers)
                {
                    string serverKey = server.Key;
                    if (serverInfos.ContainsKey(serverKey))
                    {
                        commandGroup[serverKey].Add(cmd);
                    }
                    else
                    {
                        commandGroup.Add(serverKey, new List <ICommand>()
                        {
                            cmd
                        });
                        serverInfos.Add(serverKey, server);
                    }
                }
            }

            #endregion

            #region Verify database server provider

            IEnumerable <DatabaseServerType> serverTypeList = serverInfos.Values.Select(c => c.ServerType).Distinct();
            VerifyServerProvider(serverTypeList);

            #endregion

            #region Execute commands

            //Single database server
            if (commandGroup.Count == 1)
            {
                var firstGroup     = commandGroup.First();
                var databaseServer = serverInfos[firstGroup.Key];
                var provider       = DataManager.GetDatabaseProvider(databaseServer.ServerType);
                return(await provider.ExecuteAsync(databaseServer, executeOption, firstGroup.Value).ConfigureAwait(false));
            }

            //Multiple database server
            Task <int>[] executeTasks = new Task <int> [commandGroup.Count];
            int          groupIndex   = 0;
            foreach (var cmdGroup in commandGroup)
            {
                var databaseServer = serverInfos[cmdGroup.Key];
                var provider       = DataManager.GetDatabaseProvider(databaseServer.ServerType);
                executeTasks[groupIndex] = provider.ExecuteAsync(databaseServer, executeOption, cmdGroup.Value.Select(c => c.Clone()));
                groupIndex++;
            }
            return((await Task.WhenAll(executeTasks).ConfigureAwait(false)).Sum());

            #endregion
        }
Exemple #4
0
 /// <summary>
 /// Execute command
 /// </summary>
 /// <param name="executeOption">Execute option</param>
 /// <param name="commands">Commands</param>
 /// <returns>Return effect data numbers</returns>
 public int Execute(CommandExecuteOptions executeOption, params ICommand[] commands)
 {
     return(ExecuteAsync(executeOption, commands).Result);
 }
Exemple #5
0
 /// <summary>
 /// Execute command
 /// </summary>
 /// <param name="executeOption">Execute option</param>
 /// <param name="commands">Commands</param>
 /// <returns>Return effect data numbers</returns>
 public int Execute(CommandExecuteOptions executeOption, IEnumerable <ICommand> commands)
 {
     return(ExecuteAsync(executeOption, commands).Result);
 }
Exemple #6
0
        /// <summary>
        /// Execute command
        /// </summary>
        /// <param name="executeOption">Execute option</param>
        /// <param name="commands">Commands</param>
        /// <returns>Return effect data numbers</returns>
        public async Task <int> ExecuteAsync(CommandExecuteOptions executeOption, params ICommand[] commands)
        {
            IEnumerable <ICommand> cmdCollection = commands;

            return(await ExecuteAsync(executeOption, cmdCollection).ConfigureAwait(false));
        }
        /// <summary>
        /// Execute command
        /// </summary>
        /// <param name="server">Server</param>
        /// <param name="executeOption">Execute option</param>
        /// <param name="commands">Commands</param>
        /// <returns>Return effect data numbers</returns>
        public async Task <int> ExecuteAsync(DatabaseServer server, CommandExecuteOptions executeOption, IEnumerable <ICommand> commands)
        {
            #region group execute commands

            IQueryTranslator translator = SqlServerFactory.GetQueryTranslator(server);
            List <DatabaseExecuteCommand> executeCommands = new List <DatabaseExecuteCommand>();
            var batchExecuteConfig   = DataManager.GetBatchExecuteConfiguration(server.ServerType) ?? BatchExecuteConfiguration.Default;
            var groupStatementsCount = batchExecuteConfig.GroupStatementsCount;
            groupStatementsCount = groupStatementsCount < 0 ? 1 : groupStatementsCount;
            var groupParameterCount = batchExecuteConfig.GroupParametersCount;
            groupParameterCount = groupParameterCount < 0 ? 1 : groupParameterCount;
            StringBuilder     commandTextBuilder = new StringBuilder();
            CommandParameters parameters         = null;
            int  statementsCount  = 0;
            bool forceReturnValue = false;
            int  cmdCount         = 0;

            DatabaseExecuteCommand GetGroupExecuteCommand()
            {
                var executeCommand = new DatabaseExecuteCommand()
                {
                    CommandText      = commandTextBuilder.ToString(),
                    CommandType      = CommandType.Text,
                    ForceReturnValue = forceReturnValue,
                    Parameters       = parameters
                };

                statementsCount = 0;
                translator.ParameterSequence = 0;
                commandTextBuilder.Clear();
                parameters       = null;
                forceReturnValue = false;
                return(executeCommand);
            }

            foreach (var cmd in commands)
            {
                DatabaseExecuteCommand executeCommand = GetExecuteDbCommand(translator, cmd as RdbCommand);
                if (executeCommand == null)
                {
                    continue;
                }

                //Trace log
                SqlServerFactory.LogExecuteCommand(executeCommand);

                cmdCount++;
                if (executeCommand.PerformAlone)
                {
                    if (statementsCount > 0)
                    {
                        executeCommands.Add(GetGroupExecuteCommand());
                    }
                    executeCommands.Add(executeCommand);
                    continue;
                }
                commandTextBuilder.AppendLine(executeCommand.CommandText);
                parameters        = parameters == null ? executeCommand.Parameters : parameters.Union(executeCommand.Parameters);
                forceReturnValue |= executeCommand.ForceReturnValue;
                statementsCount++;
                if (translator.ParameterSequence >= groupParameterCount || statementsCount >= groupStatementsCount)
                {
                    executeCommands.Add(GetGroupExecuteCommand());
                }
            }
            if (statementsCount > 0)
            {
                executeCommands.Add(GetGroupExecuteCommand());
            }

            #endregion

            return(await ExecuteCommandAsync(server, executeOption, executeCommands, executeOption?.ExecuteByTransaction ?? cmdCount > 1).ConfigureAwait(false));
        }
 /// <summary>
 /// Execute command
 /// </summary>
 /// <param name="server">Server</param>
 /// <param name="executeOption">Execute option</param>
 /// <param name="commands">Commands</param>
 /// <returns>Return effect data numbers</returns>
 public int Execute(DatabaseServer server, CommandExecuteOptions executeOption, params ICommand[] commands)
 {
     return(ExecuteAsync(server, executeOption, commands).Result);
 }
 /// <summary>
 /// Execute command
 /// </summary>
 /// <param name="server">Server</param>
 /// <param name="executeOption">Execute option</param>
 /// <param name="commands">Commands</param>
 /// <returns>Return effect data numbers</returns>
 public int Execute(DatabaseServer server, CommandExecuteOptions executeOption, IEnumerable <ICommand> commands)
 {
     return(ExecuteAsync(server, executeOption, commands).Result);
 }