From fb7eb01a2bbff9e3db5f8479bec85a82825e169e Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 5 May 2023 17:01:52 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20OracleOledb=20?= =?UTF-8?q?=E5=BC=95=E8=B5=B7=E7=9A=84=E8=AF=BB=E5=8F=96=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=20-=20=E8=B0=83=E6=95=B4=20DynamicE?= =?UTF-8?q?ntity=20API=EF=BC=9B#1505?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicCompileHelper.cs | 92 --------- .../FreeSql.Extensions.DynamicEntity.csproj | 42 ---- .../FreeSql.Extensions.DynamicEntity.xml | 81 -------- .../FreeSql.Extensions.DynamicEntity/key.snk | Bin 596 -> 0 bytes FreeSql.DbContext/FreeSql.DbContext.xml | 9 + .../DynamicEntity/DynamicEntityTest.cs | 37 ++-- .../FreeSql.Tests/FreeSql.Tests.csproj | 1 - FreeSql.sln | 15 -- .../Extensions/DynamicEntityExtensions.cs | 69 ++++++- FreeSql/FreeSql.xml | 183 ------------------ .../SelectProvider/Select0Provider.cs | 1 + .../SelectProvider/Select0ProviderReader.cs | 5 +- .../FreeSql.Provider.MySql/MySqlProvider.cs | 7 +- .../FreeSql.Provider.Oracle/OracleProvider.cs | 17 +- 14 files changed, 109 insertions(+), 450 deletions(-) delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/key.snk rename Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs => FreeSql/Extensions/DynamicEntityExtensions.cs (79%) diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs deleted file mode 100644 index dec44591..00000000 --- a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Security.Cryptography; -using System.Text; - -namespace FreeSql.Extensions.DynamicEntity -{ - /// - /// 动态创建对象帮助类 - /// - public class DynamicCompileHelper - { - /// - /// 动态构建Class - Type - /// - /// - public static DynamicCompileBuilder DynamicBuilder() - { - return new DynamicCompileBuilder(); - } - - /// - /// 委托缓存 - /// - private static readonly ConcurrentDictionary DelegateCache = - new ConcurrentDictionary(); - - /// - /// 设置动态对象的属性值 - /// - /// - /// - /// - public static object CreateObjectByType(Type type, Dictionary porpertys) - { - if (type == null) - return null; - object istance = Activator.CreateInstance(type); - if (istance == null) - return null; - //根据key确定缓存 - var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); - var dicKey = Md5Encryption(cacheKeyStr); - var cacheKey = $"{type.GetHashCode()}-{dicKey}"; - var dynamicDelegate = DelegateCache.GetOrAdd(cacheKey, key => - { - //表达式目录树构建委托 - var typeParam = Expression.Parameter(type); - var dicParamType = typeof(Dictionary); - var dicParam = Expression.Parameter(dicParamType); - var exps = new List(); - var tempRef = Expression.Variable(typeof(object)); - foreach (var pinfo in porpertys) - { - var propertyInfo = type.GetProperty(pinfo.Key); - if (propertyInfo == null) - continue; - var propertyName = Expression.Constant(pinfo.Key, typeof(string)); - exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); - exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), - Expression.Convert(tempRef, propertyInfo.PropertyType))); - exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); - } - - var returnTarget = Expression.Label(type); - exps.Add(Expression.Return(returnTarget, typeParam)); - exps.Add(Expression.Label(returnTarget, Expression.Default(type))); - var block = Expression.Block(new[] { tempRef }, exps); - var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); - return @delegate; - }); - var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); - return dynamicInvoke; - } - - private static string Md5Encryption(string inputStr) - { - var result = string.Empty; - //32位大写 - using (var md5 = MD5.Create()) - { - var resultBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(inputStr)); - result = BitConverter.ToString(resultBytes); - } - - return result; - } - } -} \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj deleted file mode 100644 index 321f8a2d..00000000 --- a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - netstandard2.1;net451;net45; - True - true - FreeSql;ncc;YeXiangQin;Daily - FreeSql 扩展包,可实现动态构建实体类,动态创建表. - https://github.com/2881099/FreeSql - https://github.com/2881099/FreeSql - git - MIT - FreeSql;ORM - $(AssemblyName) - logo.png - $(AssemblyName) - true - true - true - key.snk - false - 3.2.694 $(AssemblyName) - logo.png - $(AssemblyName) - true - true - true - key.snk - false - FreeSql.Extensions.DynamicEntity.xml - - - - - - - - Always - - - - \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml deleted file mode 100644 index a2ae1e55..00000000 --- a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - FreeSql.Extensions.DynamicEntity - - - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - - - - 动态创建对象帮助类 - - - - - 动态构建Class - Type - - - - - - 委托缓存 - - - - - 设置动态对象的属性值 - - - - - - - diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/key.snk b/Extensions/FreeSql.Extensions.DynamicEntity/key.snk deleted file mode 100644 index e580bc8d5d64e7c5a0c62b971545d38cfbe7d837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096c(W3|+clf|4d2=6Xc+R`Gd@9@k@Meh} zR8`}1=JPk=q?Zlr?i$1O?SgX-{{&z z|LRF?-aWODhAO}h_7M!wz}uPXx}n-g{((r9{{%_ z4)%gVXcj;Ru@GYAIZI@e#GBtO#O5m-Qr4X_lbAV}=qNRkd0^`@I6i9k`wSe@ZPxVo zk;MXig(S-cYHE!0GWWlp7EH@E!WkF6jS+3z4rvW0%Sq;U1bq`B9*HNJjxo*23*7Vw zHyt>{2CR~8==`lYLgAmwsXPXYZ_AEAKy|PuUz0(G)L1xO{{*n6Bn?mV~QKg!055THihpc>GOh(U-NgO?4_DzY4uq!p9=Q;`G i9;v3GkC674Mbx4_b$)?7a0%Z%&zUjzbGs@!l^s|B diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs index 77579f8c..c1385540 100644 --- a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -11,15 +11,14 @@ namespace FreeSql.Tests.DynamicEntity { public class DynamicEntityTest { - private static IFreeSql fsql = new FreeSqlBuilder().UseConnectionString(DataType.PostgreSQL, - "Host=192.168.0.36;Port=5432;Username=postgres;Password=123; Database=test;ArrayNullabilityMode=Always;Pooling=true;Minimum Pool Size=1") + private static IFreeSql fsql = new FreeSqlBuilder().UseConnectionString(DataType.Sqlite, + "data source=:memory:") .UseMonitorCommand(d => Console.WriteLine(d.CommandText)).Build(); [Fact] public void NormalTest() { - Type type = DynamicCompileHelper.DynamicBuilder() - .Class("NormalUsers") + var table = fsql.CodeFirst.DynamicEntity("NormalUsers") .Property("Id", typeof(string)) .Property("Name", typeof(string)) .Property("Address", typeof(string)) @@ -30,18 +29,17 @@ namespace FreeSql.Tests.DynamicEntity ["Id"] = Guid.NewGuid().ToString(), ["Address"] = "北京市" }; - var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + var instance = table.CreateInstance(dict); //根据Type生成表 - fsql.CodeFirst.SyncStructure(type); - fsql.Insert().AsType(type).AppendData(instance).ExecuteAffrows(); + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); } [Fact] public void AttributeTest() { - Type type = DynamicCompileHelper.DynamicBuilder() - .Class("AttributeUsers", new TableAttribute() { Name = "T_Attribute_User" }, - new IndexAttribute("Name_Index", "Name", false)) + var table = fsql.CodeFirst.DynamicEntity("AttributeUsers", new TableAttribute() { Name = "T_Attribute_User" }, + new IndexAttribute("Name_Index1", "Name", false)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) .Property("Name", typeof(string), @@ -54,19 +52,18 @@ namespace FreeSql.Tests.DynamicEntity ["Name"] = "张三", ["Address"] = "北京市" }; - var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + var instance = table.CreateInstance(dict); //根据Type生成表 - fsql.CodeFirst.SyncStructure(type); - var insertId = fsql.Insert().AsType(type).AppendData(instance).ExecuteIdentity(); - var select = fsql.Select().AsType(type).ToList(); + fsql.CodeFirst.SyncStructure(table.Type); + var insertId = fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteIdentity(); + var select = fsql.Select().AsType(table.Type).ToList(); } [Fact] public void SuperClassTest() { - Type type = DynamicCompileHelper.DynamicBuilder() - .Class("Roles", new TableAttribute() { Name = "T_Role" }, - new IndexAttribute("Name_Index", "Name", false)) + var table = fsql.CodeFirst.DynamicEntity("Roles", new TableAttribute() { Name = "T_Role" }, + new IndexAttribute("Name_Index2", "Name", false)) .Extend(typeof(BaseModel)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) @@ -79,10 +76,10 @@ namespace FreeSql.Tests.DynamicEntity ["UpdateTime"] = DateTime.Now, ["UpdatePerson"] = "admin" }; - var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + var instance = table.CreateInstance(dict); //根据Type生成表 - fsql.CodeFirst.SyncStructure(type); - fsql.Insert().AsType(type).AppendData(instance).ExecuteAffrows(); + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); } } public class BaseModel diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj index d9745794..79602ff3 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj @@ -35,7 +35,6 @@ - diff --git a/FreeSql.sln b/FreeSql.sln index 4dd2b5f1..e20ed226 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -125,8 +125,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Xugu", "Pr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Xugu", "FreeSql.Tests\FreeSql.Tests.Provider.Xugu\FreeSql.Tests.Provider.Xugu.csproj", "{16C21D77-20AC-4722-AD97-F53BDDE8210C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.DynamicEntity", "Extensions\FreeSql.Extensions.DynamicEntity\FreeSql.Extensions.DynamicEntity.csproj", "{FC4639EC-7787-4F85-AC02-26875E39E573}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -749,18 +747,6 @@ Global {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x64.Build.0 = Release|Any CPU {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.ActiveCfg = Release|Any CPU {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.Build.0 = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x64.ActiveCfg = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x64.Build.0 = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x86.ActiveCfg = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x86.Build.0 = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|Any CPU.Build.0 = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x64.ActiveCfg = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x64.Build.0 = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x86.ActiveCfg = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -801,7 +787,6 @@ Global {8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE} = {2A381C57-2697-427B-9F10-55DA11FD02E4} {71A6F937-D11B-4AE4-9933-BB6B4D925665} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} {8064870C-22EA-4A58-972D-DBD57D096D91} = {2A381C57-2697-427B-9F10-55DA11FD02E4} - {FC4639EC-7787-4F85-AC02-26875E39E573} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution RESX_NeutralResourcesLanguage = en-US diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs b/FreeSql/Extensions/DynamicEntityExtensions.cs similarity index 79% rename from Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs rename to FreeSql/Extensions/DynamicEntityExtensions.cs index be1bbf0e..f4659e1e 100644 --- a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs +++ b/FreeSql/Extensions/DynamicEntityExtensions.cs @@ -1,4 +1,14 @@ -using System; +// by: Daily + +#if net40 || NETSTANDARD2_0 +# else + +using FreeSql; +using FreeSql.DataAnnotations; +using FreeSql.Extensions.DynamicEntity; +using FreeSql.Internal.CommonProvider; +using FreeSql.Internal.Model; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -7,6 +17,50 @@ using System.Reflection.Emit; using System.Security.Cryptography; using System.Text; +public static class FreeSqlGlobalDynamicEntityExtensions +{ + /// + /// 动态构建Class Type + /// + /// + public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, params Attribute[] attributes) + { + return new DynamicCompileBuilder((codeFirst as CodeFirstProvider)._orm, className, attributes); + } + + /// + /// 根据字典,创建 table 对应的实体对象 + /// + /// + /// + /// + public static object CreateInstance(this TableInfo table, Dictionary dict) + { + if (table == null || dict == null) return null; + var instance = table.Type.CreateInstanceGetDefaultValue(); + foreach (var key in table.ColumnsByCs.Keys) + { + if (dict.ContainsKey(key) == false) continue; + table.ColumnsByCs[key].SetValue(instance, dict[key]); + } + return instance; + } + /// + /// 根据实体对象,创建 table 对应的字典 + /// + /// + /// + /// + public static Dictionary CreateDictionary(this TableInfo table, object instance) + { + if (table == null || instance == null) return null; + var dict = new Dictionary(); + foreach (var key in table.ColumnsByCs.Keys) + dict[key] = table.ColumnsByCs[key].GetValue(instance); + return dict; + } +} + namespace FreeSql.Extensions.DynamicEntity { /// @@ -18,6 +72,7 @@ namespace FreeSql.Extensions.DynamicEntity private Attribute[] _tableAttributes = null; private List _properties = new List(); private Type _superClass = null; + private IFreeSql _fsql = null; /// /// 配置Class @@ -25,11 +80,11 @@ namespace FreeSql.Extensions.DynamicEntity /// 类名 /// 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] /// - public DynamicCompileBuilder Class(string className, params Attribute[] attributes) + public DynamicCompileBuilder(IFreeSql fsql, string className, params Attribute[] attributes) { + _fsql = fsql; _className = className; _tableAttributes = attributes; - return this; } /// @@ -157,7 +212,7 @@ namespace FreeSql.Extensions.DynamicEntity /// Emit动态创建出Class - Type /// /// - public Type Build() + public TableInfo Build() { //初始化AssemblyName的一个实例 var assemblyName = new AssemblyName("FreeSql.DynamicCompileBuilder"); @@ -177,7 +232,8 @@ namespace FreeSql.Extensions.DynamicEntity SetPropertys(ref typeBuilder); //创建类的Type对象 - return typeBuilder.CreateType(); + var type = typeBuilder.CreateType(); + return _fsql.CodeFirst.GetTableByEntity(type); } /// @@ -226,4 +282,5 @@ namespace FreeSql.Extensions.DynamicEntity public Attribute[] Attributes { get; set; } } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..1973f9b2 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3519,177 +3519,6 @@ - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - 命令超时设置(秒) - - true: 成功, false: 失败 - - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - - 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 可自定义解析表达式 @@ -4680,12 +4509,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4761,12 +4584,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index a8e21139..1f2d5e38 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -342,6 +342,7 @@ namespace FreeSql.Internal.CommonProvider [typeof(string)] = typeof(DbDataReader).GetMethod("GetString", new Type[] { typeof(int) }), //[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }) 有些驱动不兼容 }; + public static Dictionary> _dicMethodDataReaderGetValueOverride = new Dictionary>(); public static MethodInfo MethodStringContains = typeof(string).GetMethod("Contains", new[] { typeof(string) }); public static MethodInfo MethodStringStartsWith = typeof(string).GetMethod("StartsWith", new[] { typeof(string) }); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs index 87f8e031..3908e4c0 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs @@ -744,8 +744,11 @@ namespace FreeSql.Internal.CommonProvider _orm.Aop.AuditDataReaderHandler == null && _dicMethodDataReaderGetValue.TryGetValue(col.Attribute.MapType.NullableTypeOrThis(), out var drGetValueMethod)) { + if (_dicMethodDataReaderGetValueOverride.TryGetValue(_orm.Ado.DataType, out var drDictOverride) && drDictOverride.TryGetValue(col.Attribute.MapType.NullableTypeOrThis(), out var drDictOverrideGetValueMethod)) + drGetValueMethod = drDictOverrideGetValueMethod; + Expression drvalExp = Expression.Call(rowExp, drGetValueMethod, Expression.Constant(colidx)); - if (col.CsType.IsNullableType()) drvalExp = Expression.Convert(drvalExp, col.CsType); + if (col.CsType.IsNullableType() || drGetValueMethod.ReturnType != col.CsType) drvalExp = Expression.Convert(drvalExp, col.CsType); drvalExp = Expression.Condition(Expression.Call(rowExp, _MethodDataReaderIsDBNull, Expression.Constant(colidx)), Expression.Default(col.CsType), drvalExp); if (drvalType.IsArray || drvalType.IsEnum || Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(drvalType)) diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs index 42cdb1cc..d75fd27f 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -2,8 +2,10 @@ using FreeSql.Internal.CommonProvider; using FreeSql.MySql.Curd; using System; +using System.Collections.Generic; using System.Data.Common; using System.Linq.Expressions; +using System.Reflection; using System.Threading; namespace FreeSql.MySql @@ -35,8 +37,9 @@ namespace FreeSql.MySql return null; }); - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(DateTimeOffset)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql] = new Dictionary(); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(DateTimeOffset)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); } public override ISelect CreateSelectProvider(object dywhere) => new MySqlSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); diff --git a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs index e63680c8..92792c51 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs @@ -6,6 +6,8 @@ using System.Text.RegularExpressions; using System.Collections.Concurrent; using System.Threading; using System.IO; +using System.Collections.Generic; +using System.Reflection; namespace FreeSql.Oracle { @@ -30,13 +32,14 @@ namespace FreeSql.Oracle this.CodeFirst = new OracleCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); #if oledb - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(bool)] = typeof(DbDataReader).GetMethod("GetBoolean", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(int)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(long)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(decimal)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(DateTime)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(string)] = typeof(DbDataReader).GetMethod("GetString", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle] = new Dictionary(); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(bool)] = typeof(DbDataReader).GetMethod("GetBoolean", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(int)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(long)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(decimal)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(DateTime)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(string)] = typeof(DbDataReader).GetMethod("GetString", new Type[] { typeof(int) }); this.Aop.CommandBefore += (_, e) => {