mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 修复 批量插入 Values 数量限制超出的判断;
This commit is contained in:
		@@ -193,23 +193,108 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            public DateTime? ct2 { get; set; }
 | 
					            public DateTime? ct2 { get; set; }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public class TBatInst
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid Id { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Test02()
 | 
					        public void Test02()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var serverTime = g.pgsql.Select<TestIgnoreDefaultValue>().Limit(1).First(a => DateTime.UtcNow);
 | 
					            g.sqlserver.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var timeOffset = DateTime.UtcNow.Subtract(serverTime); //减去数据库时间
 | 
					            g.mysql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.pgsql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.oracle.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.sqlite.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.pgsql.Aop.AuditValue += new EventHandler<Aop.AuditValueEventArgs>((_, e) =>
 | 
					            g.sqlserver.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
            {
 | 
					            g.mysql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
                if (e.Column.Attribute.MapType.NullableTypeOrThis() == typeof(DateTime))
 | 
					            g.pgsql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
                {
 | 
					            g.oracle.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
                    if (e.Value == null || (DateTime)e.Value == default(DateTime))
 | 
					            g.sqlite.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
                    {
 | 
					
 | 
				
			||||||
                        e.Value = DateTime.Now.Subtract(timeOffset);
 | 
					            Assert.Equal(1048, g.sqlserver.Select<TBatInst>().Count());
 | 
				
			||||||
                        return;
 | 
					            Assert.Equal(1048, g.mysql.Select<TBatInst>().Count());
 | 
				
			||||||
                    }
 | 
					            Assert.Equal(1048, g.pgsql.Select<TBatInst>().Count());
 | 
				
			||||||
                }
 | 
					            Assert.Equal(1048, g.oracle.Select<TBatInst>().Count());
 | 
				
			||||||
            });
 | 
					            Assert.Equal(1048, g.sqlite.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.sqlserver.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.mysql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.pgsql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.oracle.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.sqlite.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.sqlserver.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.mysql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.pgsql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.oracle.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.sqlite.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1048, g.sqlserver.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(1048, g.mysql.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(1048, g.pgsql.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(1048, g.oracle.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(1048, g.sqlite.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.sqlserver.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.mysql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.pgsql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.oracle.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.sqlite.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.sqlserver.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.mysql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.pgsql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.oracle.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.sqlite.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.sqlserver.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.mysql.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.pgsql.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.oracle.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.sqlite.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.sqlserver.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.mysql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.pgsql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.oracle.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.sqlite.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.sqlserver.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.mysql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.pgsql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.oracle.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            g.sqlite.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.sqlserver.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.mysql.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.pgsql.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.oracle.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					            Assert.Equal(3348, g.sqlite.Select<TBatInst>().Count());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //var serverTime = g.pgsql.Select<TestIgnoreDefaultValue>().Limit(1).First(a => DateTime.UtcNow);
 | 
				
			||||||
 | 
					            //var timeOffset = DateTime.UtcNow.Subtract(serverTime); //减去数据库时间
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //g.pgsql.Aop.AuditValue += new EventHandler<Aop.AuditValueEventArgs>((_, e) =>
 | 
				
			||||||
 | 
					            //{
 | 
				
			||||||
 | 
					            //    if (e.Column.Attribute.MapType.NullableTypeOrThis() == typeof(DateTime))
 | 
				
			||||||
 | 
					            //    {
 | 
				
			||||||
 | 
					            //        if (e.Value == null || (DateTime)e.Value == default(DateTime))
 | 
				
			||||||
 | 
					            //        {
 | 
				
			||||||
 | 
					            //            e.Value = DateTime.Now.Subtract(timeOffset);
 | 
				
			||||||
 | 
					            //            return;
 | 
				
			||||||
 | 
					            //        }
 | 
				
			||||||
 | 
					            //    }
 | 
				
			||||||
 | 
					            //});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.pgsql.Delete<TestIgnoreDefaultValue>().Where("1=1").ExecuteAffrows();
 | 
					            g.pgsql.Delete<TestIgnoreDefaultValue>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -147,37 +147,21 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            parameterLimit = parameterLimit - 1;
 | 
					            parameterLimit = parameterLimit - 1;
 | 
				
			||||||
            if (_source == null || _source.Any() == false) return new List<T1>[0];
 | 
					            if (_source == null || _source.Any() == false) return new List<T1>[0];
 | 
				
			||||||
            if (_source.Count == 1) return new[] { _source };
 | 
					            if (_source.Count == 1) return new[] { _source };
 | 
				
			||||||
            if (_noneParameter)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                if (_source.Count < valuesLimit) return new[] { _source };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var execCount = (int)Math.Ceiling(1.0 * _source.Count / valuesLimit);
 | 
					            var takeMax = valuesLimit;
 | 
				
			||||||
                var ret = new List<T1>[execCount];
 | 
					            if (_noneParameter == false)
 | 
				
			||||||
                for (var a = 0; a < execCount; a++)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    var subSource = new List<T1>();
 | 
					 | 
				
			||||||
                    subSource = _source.GetRange(a * valuesLimit, Math.Min(valuesLimit, _source.Count - a * valuesLimit));
 | 
					 | 
				
			||||||
                    ret[a] = subSource;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                return ret;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var colSum = _table.Columns.Count - _ignore.Count;
 | 
					                var colSum = _table.Columns.Count - _ignore.Count;
 | 
				
			||||||
                var takeMax = parameterLimit / colSum;
 | 
					                takeMax = parameterLimit / colSum;
 | 
				
			||||||
                var pamTotal = colSum * _source.Count;
 | 
					                if (takeMax > valuesLimit) takeMax = valuesLimit;
 | 
				
			||||||
                if (pamTotal < parameterLimit) return new[] { _source };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                var execCount = (int)Math.Ceiling(1.0 * pamTotal / takeMax / colSum);
 | 
					 | 
				
			||||||
                var ret = new List<T1>[execCount];
 | 
					 | 
				
			||||||
                for (var a = 0; a < execCount; a++)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    var subSource = new List<T1>();
 | 
					 | 
				
			||||||
                    subSource = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
 | 
					 | 
				
			||||||
                    ret[a] = subSource;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                return ret;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (_source.Count <= takeMax) return new[] { _source };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var execCount = (int)Math.Ceiling(1.0 * _source.Count / takeMax);
 | 
				
			||||||
 | 
					            var ret = new List<T1>[execCount];
 | 
				
			||||||
 | 
					            for (var a = 0; a < execCount; a++)
 | 
				
			||||||
 | 
					                ret[a] = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
 | 
					        protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,37 +107,21 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            parameterLimit = parameterLimit - 1;
 | 
					            parameterLimit = parameterLimit - 1;
 | 
				
			||||||
            if (_source == null || _source.Any() == false) return new List<T1>[0];
 | 
					            if (_source == null || _source.Any() == false) return new List<T1>[0];
 | 
				
			||||||
            if (_source.Count == 1) return new[] { _source };
 | 
					            if (_source.Count == 1) return new[] { _source };
 | 
				
			||||||
            if (_noneParameter)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                if (_source.Count < valuesLimit) return new[] { _source };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var execCount = (int)Math.Ceiling(1.0 * _source.Count / valuesLimit);
 | 
					            var takeMax = valuesLimit;
 | 
				
			||||||
                var ret = new List<T1>[execCount];
 | 
					            if (_noneParameter == false)
 | 
				
			||||||
                for (var a = 0; a < execCount; a++)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    var subSource = new List<T1>();
 | 
					 | 
				
			||||||
                    subSource = _source.GetRange(a * valuesLimit, Math.Min(valuesLimit, _source.Count - a * valuesLimit));
 | 
					 | 
				
			||||||
                    ret[a] = subSource;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                return ret;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var colSum = _table.Columns.Count - _ignore.Count;
 | 
					                var colSum = _table.Columns.Count - _ignore.Count;
 | 
				
			||||||
                var takeMax = parameterLimit / colSum;
 | 
					                takeMax = parameterLimit / colSum;
 | 
				
			||||||
                var pamTotal = colSum * _source.Count;
 | 
					                if (takeMax > valuesLimit) takeMax = valuesLimit;
 | 
				
			||||||
                if (pamTotal < parameterLimit) return new[] { _source };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                var execCount = (int)Math.Ceiling(1.0 * pamTotal / takeMax / colSum);
 | 
					 | 
				
			||||||
                var ret = new List<T1>[execCount];
 | 
					 | 
				
			||||||
                for (var a = 0; a < execCount; a++)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    var subSource = new List<T1>();
 | 
					 | 
				
			||||||
                    subSource = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
 | 
					 | 
				
			||||||
                    ret[a] = subSource;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                return ret;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (_source.Count <= takeMax) return new[] { _source };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var execCount = (int)Math.Ceiling(1.0 * _source.Count / takeMax);
 | 
				
			||||||
 | 
					            var ret = new List<T1>[execCount];
 | 
				
			||||||
 | 
					            for (var a = 0; a < execCount; a++)
 | 
				
			||||||
 | 
					                ret[a] = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
 | 
					        protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user