protected virtual async Task <bool> CheckUpdateDelete(DbCommand cmd, ExecuteResultItem sqlResult, string sql, int changeMaxRows)
 {
     if (updateDeleteRegex.IsMatch(sql))
     {
         bool hasWhere = false;
         var  m        = updateSqlRegex.Match(sql);
         if (m.Success)
         {
             hasWhere          = true;
             sqlResult.OldData = await GetOldDataJson(cmd, m.Groups[2].Value, m.Groups[1].Value, m.Groups[3].Value, m.Groups[4].Value, changeMaxRows);
         }
         m = deleteSqlRegex.Match(sql);
         if (m.Success)
         {
             hasWhere          = true;
             sqlResult.OldData = await GetOldDataJson(cmd, "*", m.Groups[1].Value, null, m.Groups[2].Value, changeMaxRows);
         }
         if (hasWhere == false)
         {
             sqlResult.Exception = "SQL statement has no where condition!";
             return(false);
         }
     }
     return(true);
 }
        public virtual async Task <ExecuteResult> ExecuteSql_InsertUpdate(DbCommand command, string sql, int readMaxRows, int changeMaxRows)
        {
            var           m      = GetInsertUpdateRegex().Match(sql);
            ExecuteResult result = new ExecuteResult();

            if (m.Success)
            {
                result.IsException = true;
                result.Exception   = "此SQL语句包含“" + m.Value + "”关键字!";
                return(result);
            }
            var list    = SqlStringList.SplitString(sql);
            var sqlList = list.SplitBySemi();

            try {
                result.Result = new List <ExecuteResultItem>();
                bool isRollback = false;
                using (var tran = await command.Connection.BeginTransactionAsync()) {
                    foreach (var item in sqlList)
                    {
                        ExecuteResultItem sqlResult = new ExecuteResultItem();
                        result.Result.Add(sqlResult);
                        var b = await CheckUpdateDelete(command, sqlResult, item, changeMaxRows);

                        if (b)
                        {
                            b = await ExecuteSql(command, sqlResult, item, readMaxRows);
                        }
                        if (b == false)
                        {
                            result.IsException = true;
                            result.Exception   = sqlResult.Exception;
                            result.Result      = null;
                            isRollback         = true;
                            tran.Rollback();
                            break;
                        }
                    }
                    if (isRollback == false)
                    {
                        await tran.CommitAsync();
                    }
                }
            } catch (Exception x) {
                result.IsException = true;
                result.Exception   = x.Message;
                result.Result      = null;
            }
            return(result);
        }
    protected ExecuteResultItem[] BuildResult(BatchCompletionStateResponse response)
    {
        var detailedErrors             = response.DetailedErrors.ToDictionary(x => x.Item1, x => x.Item2);
        var additionalErrorsPerMessage = response.AdditionalErrorsPerMessage.ToHashSet();
        var result = new ExecuteResultItem[response.ProcessedMessages];

        for (var i = 0; i < result.Length; i++)
        {
            var recordsAffected = i < response.UpdatedRecordsPerMessage.Length
                                ? response.UpdatedRecordsPerMessage[i]
                                : -1;
            if (detailedErrors.TryGetValue(i, out var exception))
            {
                result[i] = new ExecuteResultItem()
                {
                    RecordsAffected = recordsAffected,
                    IsError         = true,
                    Exception       = exception,
                };
            }
            else if (additionalErrorsPerMessage.Contains(i))
            {
                result[i] = new ExecuteResultItem()
                {
                    RecordsAffected = recordsAffected,
                    IsError         = true,
                    Exception       = null,
                };
            }
            else
            {
                result[i] = new ExecuteResultItem()
                {
                    RecordsAffected = recordsAffected,
                    IsError         = false,
                    Exception       = null,
                };
            }
        }
        return(result);
    }
        public virtual async Task <ExecuteResult> ExecuteSql_AllPermissions(DbCommand command, string sql)
        {
            var           list    = SqlStringList.SplitString(sql);
            var           sqlList = list.SplitBySemi();
            ExecuteResult result  = new ExecuteResult();

            try {
                result.Result = new List <ExecuteResultItem>();
                bool isRollback = false;
                using (var tran = await command.Connection.BeginTransactionAsync()) {
                    foreach (var item in sqlList)
                    {
                        ExecuteResultItem sqlResult = new ExecuteResultItem();
                        result.Result.Add(sqlResult);

                        var b = await ExecuteSql(command, sqlResult, item, int.MaxValue);

                        if (b == false)
                        {
                            result.IsException = true;
                            result.Exception   = sqlResult.Exception;
                            result.Result      = null;
                            isRollback         = true;
                            tran.Rollback();
                            break;
                        }
                    }
                    if (isRollback == false)
                    {
                        await tran.CommitAsync();
                    }
                }
            } catch (Exception x) {
                result.IsException = true;
                result.Exception   = x.Message;
                result.Result      = null;
            }
            return(result);
        }
        public virtual async Task <ExecuteResult> ExecuteSql_Select(DbCommand command, string sql, int readMaxRows)
        {
            var           m      = GetSelectRegex().Match(sql);
            ExecuteResult result = new ExecuteResult();

            if (m.Success)
            {
                result.IsException = true;
                result.Exception   = "此SQL语句包含“" + m.Value + "”关键字!";
                return(result);
            }
            var list    = SqlStringList.SplitString(sql);
            var sqlList = list.SplitBySemi();

            try {
                result.Result = new List <ExecuteResultItem>();
                foreach (var item in sqlList)
                {
                    ExecuteResultItem sqlResult = new ExecuteResultItem();
                    result.Result.Add(sqlResult);
                    var b = await ExecuteSql(command, sqlResult, item, readMaxRows);

                    if (b == false)
                    {
                        result.IsException = true;
                        result.Exception   = sqlResult.Exception;
                        result.Result      = null;
                        break;
                    }
                }
            } catch (Exception x) {
                result.IsException = true;
                result.Exception   = x.Message;
                result.Result      = null;
            }
            return(result);
        }
        protected virtual async Task <bool> ExecuteSql(DbCommand cmd, ExecuteResultItem sqlResult, string sql, int readMaxRows)
        {
            cmd.CommandText     = sql;
            sqlResult.Sql       = sql;
            sqlResult.StartTime = DateTime.Now;
            System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();
            DbDataReader reader = null;

            try {
                reader = await cmd.ExecuteReaderAsync();

                if (reader.RecordsAffected > 0)
                {
                    sqlResult.ChangeCount = reader.RecordsAffected;
                }
                int fieldCount = reader.FieldCount;
                if (fieldCount == 0)
                {
                    return(true);
                }

                sqlResult.Columns = new List <string>();
                sqlResult.Values  = new List <object[]>();
                for (int i = 0; i < fieldCount; i++)
                {
                    sqlResult.Columns.Add(reader.GetName(i));
                }
                object[] vals = null; int rows = 0;
                while (await reader.ReadAsync())
                {
                    if (rows >= readMaxRows)
                    {
                        sqlResult.IsOverflow = true; break;
                    }
                    vals = new object[fieldCount];
                    reader.GetValues(vals);
                    sqlResult.Values.Add(vals);
                    rows++;
                }
                for (int i = 0; i < sqlResult.Columns.Count; i++)
                {
                    var name = sqlResult.Columns[i];
                    if (string.IsNullOrEmpty(name))
                    {
                        if (i == 0)
                        {
                            sqlResult.Columns[i] = "Result";
                        }
                        else
                        {
                            sqlResult.Columns[i] = "Result_" + i.ToString();
                        }
                    }
                }
                return(true);
            } catch (Exception ex) {
                stopwatch.Stop();
                sqlResult.RunTime   = stopwatch.ElapsedMilliseconds;
                sqlResult.Exception = ex.Message;
            } finally {
                if (reader != null && reader.IsClosed == false)
                {
                    reader.Close();
                }
            }
            return(false);
        }