mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	修改异步插入或修改时由于无法获取执行状态导致的无限循环,添加decimal数据类型(最后一位小数点精度会丢失)
This commit is contained in:
		@@ -538,5 +538,14 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            批量注入 Repository,可以参考代码自行调整
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="services"></param>
 | 
				
			||||||
 | 
					            <param name="globalDataFilter"></param>
 | 
				
			||||||
 | 
					            <param name="assemblies"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,18 +36,14 @@ namespace FreeSql.Tests.MySql
 | 
				
			|||||||
            public int? Points { get; set; }
 | 
					            public int? Points { get; set; }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        [FreeSql.DataAnnotations.Table(Name = "ClickHouseTest")]
 | 
					        [FreeSql.DataAnnotations.Table(Name = "ClickHouseTest")]
 | 
				
			||||||
        public class TestClickHouse : IEnumerable
 | 
					        public class TestClickHouse
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            [FreeSql.DataAnnotations.Column(IsPrimary = true, IsIdentity = true)]
 | 
					            [FreeSql.DataAnnotations.Column(IsPrimary = true, IsIdentity = true)]
 | 
				
			||||||
            [Now]
 | 
					            [Now]
 | 
				
			||||||
            public long Id { get; set; }
 | 
					            public long Id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            public string Name { get; set; }
 | 
					            public string Name { get; set; }
 | 
				
			||||||
            public IEnumerator GetEnumerator()
 | 
					            public Decimal Money { get; set; }
 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                yield return Id;
 | 
					 | 
				
			||||||
                yield return Name;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        class NowAttribute: Attribute { }
 | 
					        class NowAttribute: Attribute { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -231,6 +227,41 @@ namespace FreeSql.Tests.MySql
 | 
				
			|||||||
            Debug.WriteLine("更新用时:" + stopwatch.ElapsedMilliseconds.ToString());
 | 
					            Debug.WriteLine("更新用时:" + stopwatch.ElapsedMilliseconds.ToString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public async void TestInsertUpdateData()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //g.clickHouse.CodeFirst.SyncStructure<CollectDataEntity>();
 | 
				
			||||||
 | 
					            Stopwatch stopwatch = new Stopwatch();
 | 
				
			||||||
 | 
					            var fsql = g.clickHouse;
 | 
				
			||||||
 | 
					            var repository=fsql.GetRepository<CollectDataEntity>();
 | 
				
			||||||
 | 
					            await repository.DeleteAsync(o=>o.Id>0);
 | 
				
			||||||
 | 
					            List<CollectDataEntity> tables = new List<CollectDataEntity>();
 | 
				
			||||||
 | 
					            for (int i = 1; i < 3; i++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                tables.Add(new CollectDataEntity
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Id = new Random().Next(),
 | 
				
			||||||
 | 
					                    CollectTime = DateTime.Now,
 | 
				
			||||||
 | 
					                    DataFlag = "1",
 | 
				
			||||||
 | 
					                    EquipmentCode = "11",
 | 
				
			||||||
 | 
					                    UnitStr = "111",
 | 
				
			||||||
 | 
					                    PropertyCode = "1111",
 | 
				
			||||||
 | 
					                    NumericValue=1111.1119999912500M
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var insert = repository.Orm.Insert(tables);
 | 
				
			||||||
 | 
					            insert.ExecuteAffrows();
 | 
				
			||||||
 | 
					            var list = repository.Orm.Select<CollectDataEntity>().ToList();
 | 
				
			||||||
 | 
					            //var list = repository.Insert(tables);
 | 
				
			||||||
 | 
					            //var list = repository.Select.ToList();
 | 
				
			||||||
 | 
					            //list.ForEach(o=>o.EquipmentCode = "666");
 | 
				
			||||||
 | 
					            //stopwatch.Start();
 | 
				
			||||||
 | 
					            //await repository.UpdateAsync(list);
 | 
				
			||||||
 | 
					            //stopwatch.Stop();
 | 
				
			||||||
 | 
					            Debug.WriteLine("更新用时:" + stopwatch.ElapsedMilliseconds.ToString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -117,6 +117,7 @@ namespace XY.Model.Business
 | 
				
			|||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 采集数值
 | 
					        /// 采集数值
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column(StringLength = 18)]
 | 
				
			||||||
        public decimal? NumericValue { get; set; }
 | 
					        public decimal? NumericValue { get; set; }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3172,6 +3172,177 @@
 | 
				
			|||||||
            <param name="parms"></param>
 | 
					            <param name="parms"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteConnectTestAsync(System.Int32,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            测试数据库是否连接正确,本方法执行如下命令:<para></para>
 | 
				
			||||||
 | 
					            MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1<para></para>
 | 
				
			||||||
 | 
					            Oracle: SELECT 1 FROM dual<para></para>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="commandTimeout">命令超时设置(秒)</param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns>true: 成功, false: 失败</returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="readerHander"></param>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="readerHander"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            在【主库】执行
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            在【主库】执行
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <typeparam name="T"></typeparam>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <typeparam name="T"></typeparam>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <typeparam name="T1"></typeparam>
 | 
				
			||||||
 | 
					            <typeparam name="T2"></typeparam>
 | 
				
			||||||
 | 
					            <param name="cmdType"></param>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="cmdParms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object,System.Threading.CancellationToken)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 })<para></para>
 | 
				
			||||||
 | 
					            提示:parms 参数还可以传 Dictionary<string, object>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <typeparam name="T1"></typeparam>
 | 
				
			||||||
 | 
					            <typeparam name="T2"></typeparam>
 | 
				
			||||||
 | 
					            <param name="cmdText"></param>
 | 
				
			||||||
 | 
					            <param name="parms"></param>
 | 
				
			||||||
 | 
					            <param name="cancellationToken"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="E:FreeSql.IAop.ParseExpression">
 | 
					        <member name="E:FreeSql.IAop.ParseExpression">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            可自定义解析表达式
 | 
					            可自定义解析表达式
 | 
				
			||||||
@@ -4045,6 +4216,12 @@
 | 
				
			|||||||
            <param name="timeout">超时</param>
 | 
					            <param name="timeout">超时</param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.GetAsync">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            获取资源
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
 | 
					        <member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            使用完毕后,归还资源
 | 
					            使用完毕后,归还资源
 | 
				
			||||||
@@ -4115,6 +4292,12 @@
 | 
				
			|||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="obj">资源对象</param>
 | 
					            <param name="obj">资源对象</param>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnGetAsync(FreeSql.Internal.ObjectPool.Object{`0})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="obj">资源对象</param>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})">
 | 
					        <member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            归还对象给对象池的时候触发
 | 
					            归还对象给对象池的时候触发
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,7 @@ namespace FreeSql.ClickHouse
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                { typeof(double).FullName, CsToDb.New(DbType.Double, "Float64", "Float64", false, false, 0) },{ typeof(double?).FullName, CsToDb.New(DbType.Double, "Float64", "Nullable(Float64)", false, true, null) },
 | 
					                { typeof(double).FullName, CsToDb.New(DbType.Double, "Float64", "Float64", false, false, 0) },{ typeof(double?).FullName, CsToDb.New(DbType.Double, "Float64", "Nullable(Float64)", false, true, null) },
 | 
				
			||||||
                { typeof(float).FullName, CsToDb.New(DbType.Single, "Float32","Float32", false, false, 0) },{ typeof(float?).FullName, CsToDb.New(DbType.Single, "Float32","Nullable(Float32)", false, true, null) },
 | 
					                { typeof(float).FullName, CsToDb.New(DbType.Single, "Float32","Float32", false, false, 0) },{ typeof(float?).FullName, CsToDb.New(DbType.Single, "Float32","Nullable(Float32)", false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(decimal).FullName, CsToDb.New(DbType.Decimal, "Decimal128(19)","Decimal128(19)", false, false, 0) },{ typeof(decimal?).FullName, CsToDb.New(DbType.Decimal, "Nullable(Decimal128(19))","Nullable(Decimal128(19))", false, true, null) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                { typeof(DateTime).FullName, CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "DateTime('Asia/Shanghai')", false, false, new DateTime(1970,1,1)) },{ typeof(DateTime?).FullName, CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "Nullable(DateTime('Asia/Shanghai'))", false, true, null) },
 | 
					                { typeof(DateTime).FullName, CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "DateTime('Asia/Shanghai')", false, false, new DateTime(1970,1,1)) },{ typeof(DateTime?).FullName, CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "Nullable(DateTime('Asia/Shanghai'))", false, true, null) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -114,13 +115,14 @@ namespace FreeSql.ClickHouse
 | 
				
			|||||||
                            foreach (var uk in tb.Indexes)
 | 
					                            foreach (var uk in tb.Indexes)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                sb.Append(" \r\n  ");
 | 
					                                sb.Append(" \r\n  ");
 | 
				
			||||||
                                sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append("(");
 | 
					                                sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1])));
 | 
				
			||||||
                                foreach (var tbcol in uk.Columns)
 | 
					                                foreach (var tbcol in uk.Columns)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
 | 
					                                    sb.Append(" ");
 | 
				
			||||||
                                    sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
					                                    sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
				
			||||||
                                    sb.Append("TYPE set(8192) GRANULARITY 5,  ");
 | 
					                                    sb.Append("TYPE set(8192) GRANULARITY 5,  ");
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                sb.Remove(sb.Length - 2, 2).Append("),");
 | 
					                                sb.Remove(sb.Length - 2, 2);
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            sb.Remove(sb.Length - 1, 1);
 | 
					                            sb.Remove(sb.Length - 1, 1);
 | 
				
			||||||
                            sb.Append("\r\n) ");
 | 
					                            sb.Append("\r\n) ");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,6 +67,9 @@ namespace FreeSql.ClickHouse
 | 
				
			|||||||
                case "Float32":
 | 
					                case "Float32":
 | 
				
			||||||
                case "float":
 | 
					                case "float":
 | 
				
			||||||
                case "nullable(float32)": return DbType.Single;
 | 
					                case "nullable(float32)": return DbType.Single;
 | 
				
			||||||
 | 
					                case "decimal":
 | 
				
			||||||
 | 
					                case "decimal128":
 | 
				
			||||||
 | 
					                case "nullable(decimal128)": return DbType.Decimal;
 | 
				
			||||||
                case "date":
 | 
					                case "date":
 | 
				
			||||||
                case "nullable(date)": return DbType.Date;
 | 
					                case "nullable(date)": return DbType.Date;
 | 
				
			||||||
                case "datetime":
 | 
					                case "datetime":
 | 
				
			||||||
@@ -103,6 +106,7 @@ namespace FreeSql.ClickHouse
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                { (int)DbType.Double, new DbToCs("(double?)", "double.Parse({0})", "{0}.ToString()", "double?", typeof(double), typeof(double?), "{0}.Value", "GetDouble") },
 | 
					                { (int)DbType.Double, new DbToCs("(double?)", "double.Parse({0})", "{0}.ToString()", "double?", typeof(double), typeof(double?), "{0}.Value", "GetDouble") },
 | 
				
			||||||
                { (int)DbType.Single, new DbToCs("(float?)", "float.Parse({0})", "{0}.ToString()", "float?", typeof(float), typeof(float?), "{0}.Value", "GetFloat") },
 | 
					                { (int)DbType.Single, new DbToCs("(float?)", "float.Parse({0})", "{0}.ToString()", "float?", typeof(float), typeof(float?), "{0}.Value", "GetFloat") },
 | 
				
			||||||
 | 
					                { (int)DbType.Decimal, new DbToCs("(decimal?)", "decimal.Parse({0})", "{0}.ToString()", "decimal?", typeof(decimal), typeof(decimal?), "{0}.Value", "GetDecimal") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                { (int)DbType.Date, new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetDateTime") },
 | 
					                { (int)DbType.Date, new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetDateTime") },
 | 
				
			||||||
                { (int)DbType.Date, new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetDateTime") },
 | 
					                { (int)DbType.Date, new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetDateTime") },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ namespace FreeSql.ClickHouse
 | 
				
			|||||||
                            case "System.Byte": return $"cast({getExp(operandExp)} as Int8)";
 | 
					                            case "System.Byte": return $"cast({getExp(operandExp)} as Int8)";
 | 
				
			||||||
                            case "System.Char": return $"substr(cast({getExp(operandExp)} as String), 1, 1)";
 | 
					                            case "System.Char": return $"substr(cast({getExp(operandExp)} as String), 1, 1)";
 | 
				
			||||||
                            case "System.DateTime": return $"cast({getExp(operandExp)} as DateTime)";
 | 
					                            case "System.DateTime": return $"cast({getExp(operandExp)} as DateTime)";
 | 
				
			||||||
                            case "System.Decimal": return $"cast({getExp(operandExp)} as Float64)";
 | 
					                            case "System.Decimal": return $"cast({getExp(operandExp)} as Decimal128(19))";
 | 
				
			||||||
                            case "System.Double": return $"cast({getExp(operandExp)} as Float64)";
 | 
					                            case "System.Double": return $"cast({getExp(operandExp)} as Float64)";
 | 
				
			||||||
                            case "System.Int16": return $"cast({getExp(operandExp)} as Int16)";
 | 
					                            case "System.Int16": return $"cast({getExp(operandExp)} as Int16)";
 | 
				
			||||||
                            case "System.Int32": return $"cast({getExp(operandExp)} as Int32)";
 | 
					                            case "System.Int32": return $"cast({getExp(operandExp)} as Int32)";
 | 
				
			||||||
@@ -63,7 +63,7 @@ namespace FreeSql.ClickHouse
 | 
				
			|||||||
                                case "System.Byte": return $"cast({getExp(callExp.Arguments[0])} as Int8)";
 | 
					                                case "System.Byte": return $"cast({getExp(callExp.Arguments[0])} as Int8)";
 | 
				
			||||||
                                case "System.Char": return $"substr(cast({getExp(callExp.Arguments[0])} as String), 1, 1)";
 | 
					                                case "System.Char": return $"substr(cast({getExp(callExp.Arguments[0])} as String), 1, 1)";
 | 
				
			||||||
                                case "System.DateTime": return $"cast({getExp(callExp.Arguments[0])} as DateTime)";
 | 
					                                case "System.DateTime": return $"cast({getExp(callExp.Arguments[0])} as DateTime)";
 | 
				
			||||||
                                case "System.Decimal": return $"cast({getExp(callExp.Arguments[0])} as Float64)";
 | 
					                                case "System.Decimal": return $"cast({getExp(callExp.Arguments[0])} as Decimal128(19))";
 | 
				
			||||||
                                case "System.Double": return $"cast({getExp(callExp.Arguments[0])} as Float64)";
 | 
					                                case "System.Double": return $"cast({getExp(callExp.Arguments[0])} as Float64)";
 | 
				
			||||||
                                case "System.Int16": return $"cast({getExp(callExp.Arguments[0])} as Int16)";
 | 
					                                case "System.Int16": return $"cast({getExp(callExp.Arguments[0])} as Int16)";
 | 
				
			||||||
                                case "System.Int32": return $"cast({getExp(callExp.Arguments[0])} as Int32)";
 | 
					                                case "System.Int32": return $"cast({getExp(callExp.Arguments[0])} as Int32)";
 | 
				
			||||||
@@ -556,7 +556,7 @@ namespace FreeSql.ClickHouse
 | 
				
			|||||||
                    case "ToByte": return $"cast({getExp(exp.Arguments[0])} as Int8)";
 | 
					                    case "ToByte": return $"cast({getExp(exp.Arguments[0])} as Int8)";
 | 
				
			||||||
                    case "ToChar": return $"substr(cast({getExp(exp.Arguments[0])} as String), 1, 1)";
 | 
					                    case "ToChar": return $"substr(cast({getExp(exp.Arguments[0])} as String), 1, 1)";
 | 
				
			||||||
                    case "ToDateTime": return $"cast({getExp(exp.Arguments[0])} as DateTime)";
 | 
					                    case "ToDateTime": return $"cast({getExp(exp.Arguments[0])} as DateTime)";
 | 
				
			||||||
                    case "ToDecimal": return $"cast({getExp(exp.Arguments[0])} as Float64)";
 | 
					                    case "ToDecimal": return $"cast({getExp(exp.Arguments[0])} as Decimal128(19))";
 | 
				
			||||||
                    case "ToDouble": return $"cast({getExp(exp.Arguments[0])} as Float64)";
 | 
					                    case "ToDouble": return $"cast({getExp(exp.Arguments[0])} as Float64)";
 | 
				
			||||||
                    case "ToInt16":
 | 
					                    case "ToInt16":
 | 
				
			||||||
                    case "ToInt32":
 | 
					                    case "ToInt32":
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,7 +55,6 @@ namespace FreeSql.ClickHouse.Curd
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                try
 | 
					                try
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Debug.WriteLine($"开始执行时间:{DateTime.Now}");
 | 
					 | 
				
			||||||
                    before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, null, _params);
 | 
					                    before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, null, _params);
 | 
				
			||||||
                    _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
 | 
					                    _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
 | 
				
			||||||
                    using var bulkCopyInterface = new ClickHouseBulkCopy(_orm.Ado.MasterPool.Get().Value as ClickHouseConnection)
 | 
					                    using var bulkCopyInterface = new ClickHouseBulkCopy(_orm.Ado.MasterPool.Get().Value as ClickHouseConnection)
 | 
				
			||||||
@@ -170,9 +169,9 @@ namespace FreeSql.ClickHouse.Curd
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#if net40
 | 
					#if net40
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => base.SplitExecuteAffrowsAsync(_batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, _batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, cancellationToken);
 | 
					        public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => SplitExecuteAffrowsAsync(_batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, _batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, cancellationToken);
 | 
				
			||||||
        public override Task<long> ExecuteIdentityAsync(CancellationToken cancellationToken = default) => base.SplitExecuteIdentityAsync(_batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, _batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, cancellationToken);
 | 
					        public override Task<long> ExecuteIdentityAsync(CancellationToken cancellationToken = default) => SplitExecuteIdentityAsync(_batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, _batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, cancellationToken);
 | 
				
			||||||
        public override Task<List<T1>> ExecuteInsertedAsync(CancellationToken cancellationToken = default) => base.SplitExecuteInsertedAsync(_batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, _batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, cancellationToken);
 | 
					        public override Task<List<T1>> ExecuteInsertedAsync(CancellationToken cancellationToken = default) => SplitExecuteInsertedAsync(_batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, _batchValuesLimit > 0 ? _batchValuesLimit : int.MaxValue, cancellationToken);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        async protected override Task<long> RawExecuteIdentityAsync(CancellationToken cancellationToken = default)
 | 
					        async protected override Task<long> RawExecuteIdentityAsync(CancellationToken cancellationToken = default)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -255,7 +254,8 @@ namespace FreeSql.ClickHouse.Curd
 | 
				
			|||||||
            if (ss.Length == 1)
 | 
					            if (ss.Length == 1)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, 1, 1));
 | 
					                _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, 1, 1));
 | 
				
			||||||
                ret = await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
					                await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
				
			||||||
 | 
					                ret = _source.Count;
 | 
				
			||||||
                ClearData();
 | 
					                ClearData();
 | 
				
			||||||
                return ret;
 | 
					                return ret;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -269,7 +269,8 @@ namespace FreeSql.ClickHouse.Curd
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    _source = ss[a];
 | 
					                    _source = ss[a];
 | 
				
			||||||
                    _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, a + 1, ss.Length));
 | 
					                    _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, a + 1, ss.Length));
 | 
				
			||||||
                    ret += await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
					                    await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
				
			||||||
 | 
					                    ret += _source.Count;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -293,18 +293,20 @@ namespace FreeSql.ClickHouse.Curd
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#if net40
 | 
					#if net40
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => base.SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken);
 | 
					        public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken);
 | 
				
			||||||
        public override Task<List<T1>> ExecuteUpdatedAsync(CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken);
 | 
					        public override Task<List<T1>> ExecuteUpdatedAsync(CancellationToken cancellationToken = default) => SplitExecuteUpdatedAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken);
 | 
				
			||||||
        protected override Task<List<T1>> RawExecuteUpdatedAsync(CancellationToken cancellationToken = default) => throw new NotImplementedException("FreeSql.ClickHouse.Custom 未实现该功能 未实现该功能");
 | 
					        protected override Task<List<T1>> RawExecuteUpdatedAsync(CancellationToken cancellationToken = default) => throw new NotImplementedException("FreeSql.ClickHouse.Custom 未实现该功能 未实现该功能");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        async protected override Task<int> SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit, CancellationToken cancellationToken = default)
 | 
					        async protected override Task<int> SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit, CancellationToken cancellationToken = default)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var ss = SplitSource(valuesLimit, parameterLimit);
 | 
					            var ss = SplitSource(valuesLimit, parameterLimit);
 | 
				
			||||||
            var ret = 0;
 | 
					            var ret = 0;
 | 
				
			||||||
            if (ss.Length <= 1)
 | 
					            if (ss.Length <= 1)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_source?.Any() == true) _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, 1, 1));
 | 
					                if (_source?.Any() == true) _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, 1, 1));
 | 
				
			||||||
                ret = await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
					                await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
				
			||||||
 | 
					                ret = _source.Count;
 | 
				
			||||||
                ClearData();
 | 
					                ClearData();
 | 
				
			||||||
                return ret;
 | 
					                return ret;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -319,7 +321,8 @@ namespace FreeSql.ClickHouse.Curd
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    _source = ss[a];
 | 
					                    _source = ss[a];
 | 
				
			||||||
                    _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, a + 1, ss.Length));
 | 
					                    _batchProgress?.Invoke(new BatchProgressStatus<T1>(_source, a + 1, ss.Length));
 | 
				
			||||||
                    ret += await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
					                    await this.RawExecuteAffrowsAsync(cancellationToken);
 | 
				
			||||||
 | 
					                    ret += _source.Count;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user