mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 18:52:50 +08:00
- 修复 批量插入 Values 数量限制超出的判断;
This commit is contained in:
parent
e29ac93a67
commit
20e06ef3a2
@ -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,38 +147,22 @@ 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 };
|
}
|
||||||
|
if (_source.Count <= takeMax) return new[] { _source };
|
||||||
|
|
||||||
var execCount = (int)Math.Ceiling(1.0 * pamTotal / takeMax / colSum);
|
var execCount = (int)Math.Ceiling(1.0 * _source.Count / takeMax);
|
||||||
var ret = new List<T1>[execCount];
|
var ret = new List<T1>[execCount];
|
||||||
for (var a = 0; a < execCount; a++)
|
for (var a = 0; a < execCount; a++)
|
||||||
{
|
ret[a] = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
|
||||||
var subSource = new List<T1>();
|
|
||||||
subSource = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
|
|
||||||
ret[a] = subSource;
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
|
protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
|
||||||
{
|
{
|
||||||
var ss = SplitSource(valuesLimit, parameterLimit);
|
var ss = SplitSource(valuesLimit, parameterLimit);
|
||||||
|
@ -107,38 +107,22 @@ 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 };
|
}
|
||||||
|
if (_source.Count <= takeMax) return new[] { _source };
|
||||||
|
|
||||||
var execCount = (int)Math.Ceiling(1.0 * pamTotal / takeMax / colSum);
|
var execCount = (int)Math.Ceiling(1.0 * _source.Count / takeMax);
|
||||||
var ret = new List<T1>[execCount];
|
var ret = new List<T1>[execCount];
|
||||||
for (var a = 0; a < execCount; a++)
|
for (var a = 0; a < execCount; a++)
|
||||||
{
|
ret[a] = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
|
||||||
var subSource = new List<T1>();
|
|
||||||
subSource = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax));
|
|
||||||
ret[a] = subSource;
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
|
protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit)
|
||||||
{
|
{
|
||||||
var ss = SplitSource(valuesLimit, parameterLimit);
|
var ss = SplitSource(valuesLimit, parameterLimit);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user