From 53443dc22b243f97a6714221b745f2989275526f Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 8 Feb 2024 13:06:43 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20TypeHandlers=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20Enum=20=E6=9E=9A=E4=B8=BE=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E8=A7=84=E5=88=99=EF=BC=9B#1634?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeSql.xml | 302 ------------------ FreeSql/FreeSqlBuilder.cs | 2 +- .../AdoProvider/AdoProviderUtils.cs | 10 + FreeSql/Internal/UtilsExpressionTree.cs | 2 +- .../ClickHouseAdo/ClickHouseAdo.cs | 12 +- .../FreeSql.Provider.Custom/CustomAdapter.cs | 3 - .../CustomAdo/CustomAdo.cs | 10 +- .../MySql/CustomMySqlAdo/CustomMySqlAdo.cs | 14 +- .../Oracle/CustomOracleAdo/CustomOracleAdo.cs | 12 +- .../FreeSql.Provider.Custom/OracleAdapter.cs | 3 - .../CustomPostgreSQLAdo.cs | 12 +- .../CustomSqlServerAdo/CustomSqlServerAdo.cs | 10 +- .../DamengAdo/DamengAdo.cs | 12 +- .../FirebirdAdo/FirebirdAdo.cs | 12 +- .../GBaseAdo/GBaseAdo.cs | 20 +- .../FreeSql.Provider.GBase/GBaseUtils.cs | 4 +- .../KingbaseESAdo/KingbaseESAdo.cs | 12 +- .../MsAccessAdo/MsAccessAdo.cs | 8 +- .../MySqlAdo/MySqlAdo.cs | 12 +- .../Dameng/OdbcDamengAdo/OdbcDamengAdo.cs | 12 +- .../Default/OdbcAdapter.cs | 3 - .../Default/OdbcAdo/OdbcAdo.cs | 8 +- .../OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs | 12 +- .../MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs | 14 +- .../Oracle/OdbcOracleAdo/OdbcOracleAdo.cs | 12 +- .../OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs | 12 +- .../OdbcSqlServerAdo/OdbcSqlServerAdo.cs | 10 +- .../OracleAdo/OracleAdo.cs | 12 +- .../PostgreSQLAdo/PostgreSQLAdo.cs | 18 +- .../QuestDbAdo/QuestDbAdo.cs | 18 +- .../ShenTongAdo/ShenTongAdo.cs | 12 +- .../SqlServerAdo/SqlServerAdo.cs | 8 +- .../SqliteAdo/SqliteAdo.cs | 12 +- .../FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs | 14 +- 34 files changed, 120 insertions(+), 529 deletions(-) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 489e88dd..4d006dda 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3283,13 +3283,6 @@ - - - 执行SQL语句,返回更新后的记录 - 注意:此方法只有 Postgresql/SqlServer 有效果 - - - 指定事务对象 @@ -3634,177 +3627,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> - - - - - - - - 可自定义解析表达式 @@ -4804,12 +4626,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4885,12 +4701,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 @@ -6337,115 +6147,3 @@ -`0})"> - - 插入数据,传入实体集合 - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - MySql 5.6+: on duplicate key update - PostgreSQL 9.4+: on conflict do update - SqlServer 2008+: merge into - Oracle 11+: merge into - Sqlite: replace into - 达梦: merge into - 人大金仓:on conflict do update - 神通:merge into - MsAccess:不支持 - 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性) - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - 事务体 () => {} - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - - 事务体 () => {} - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs index 0142697a..e3ff2c42 100644 --- a/FreeSql/FreeSqlBuilder.cs +++ b/FreeSql/FreeSqlBuilder.cs @@ -603,7 +603,7 @@ namespace FreeSql Expression.TypeIs(valueExp, type2), Expression.Return(returnTarget, valueExp), Expression.Return(returnTarget, Expression.Convert(valueExpRet, typeof(object))) //此时不能设置 type2 - ); + ); } return null; }); diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs index a5461a4d..8f406200 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs @@ -10,6 +10,16 @@ namespace FreeSql.Internal.CommonProvider { partial class AdoProvider { + public object AddslashesTypeHandler(Type type, object param) + { + if (Utils.TypeHandlers.TryGetValue(type, out var typeHandler)) + { + var result = typeHandler.Serialize(param); + return AddslashesProcessParam(result, null, null); + } + return null; + } + public abstract object AddslashesProcessParam(object param, Type mapType, ColumnInfo mapColumn); public string Addslashes(string filter, params object[] parms) { diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index daf5ac12..954e2c1c 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -2509,7 +2509,7 @@ namespace FreeSql.Internal ); break; default: - if (type.IsEnum) + if (type.IsEnum && TypeHandlers.ContainsKey(type) == false) return Expression.Block( Expression.IfThenElse( Expression.Equal(Expression.TypeAs(valueExp, typeof(string)), Expression.Constant(string.Empty)), diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs index e90267da..aa80beb4 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs @@ -54,20 +54,14 @@ namespace FreeSql.ClickHouse else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace('\0', ' '), "'"); else if (param is Enum) - return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); //((Enum)val).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; diff --git a/Providers/FreeSql.Provider.Custom/CustomAdapter.cs b/Providers/FreeSql.Provider.Custom/CustomAdapter.cs index 70d0db06..b32c2bfc 100644 --- a/Providers/FreeSql.Provider.Custom/CustomAdapter.cs +++ b/Providers/FreeSql.Provider.Custom/CustomAdapter.cs @@ -51,9 +51,6 @@ namespace FreeSql.Custom { if (value == null) return "NULL"; if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); - - if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); - if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString(); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); diff --git a/Providers/FreeSql.Provider.Custom/CustomAdo/CustomAdo.cs b/Providers/FreeSql.Provider.Custom/CustomAdo/CustomAdo.cs index 3ccb8b43..fa00d2fd 100644 --- a/Providers/FreeSql.Provider.Custom/CustomAdo/CustomAdo.cs +++ b/Providers/FreeSql.Provider.Custom/CustomAdo/CustomAdo.cs @@ -40,12 +40,14 @@ namespace FreeSql.Custom return Adapter.UnicodeStringRawSql(param, mapColumn); else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); - else if (param is Enum) - return ((Enum)param).ToInt64(); + else if (param is Enum) + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) - return Adapter.DateTimeRawSql(param); + else if (param is DateTime) + return AddslashesTypeHandler(typeof(DateTime), param) ?? Adapter.DateTimeRawSql(param); + else if (param is DateTime?) + return AddslashesTypeHandler(typeof(DateTime?), param) ?? Adapter.DateTimeRawSql(param); else if (param is TimeSpan || param is TimeSpan?) return Adapter.TimeSpanRawSql(param); else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs index 8520980f..44c295fa 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs @@ -39,26 +39,20 @@ namespace FreeSql.Custom.MySql else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace('\0', ' '), "'"); else if (param is Enum) - return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; - else if (param is IEnumerable) + else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); diff --git a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs index 72bfe249..b58c3f41 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs @@ -53,20 +53,14 @@ namespace FreeSql.Custom.Oracle else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; diff --git a/Providers/FreeSql.Provider.Custom/OracleAdapter.cs b/Providers/FreeSql.Provider.Custom/OracleAdapter.cs index 3cd12cda..9d52af36 100644 --- a/Providers/FreeSql.Provider.Custom/OracleAdapter.cs +++ b/Providers/FreeSql.Provider.Custom/OracleAdapter.cs @@ -51,9 +51,6 @@ namespace FreeSql.Custom { if (value == null) return "NULL"; if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); - - if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); - if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString(); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs index a76f9ebe..d8c11269 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs @@ -41,20 +41,14 @@ namespace FreeSql.Custom.PostgreSQL else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs index d71ff666..74000096 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs @@ -46,19 +46,21 @@ namespace FreeSql.Custom.SqlServer else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } else if (param is DateTime?) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime?), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } @@ -72,7 +74,7 @@ namespace FreeSql.Custom.SqlServer return ((TimeSpan)param).TotalSeconds; else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; - else if (param is IEnumerable) + else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); return string.Concat("'", param.ToString().Replace("'", "''"), "'"); diff --git a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs index f8d65b66..b9aa5a67 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs @@ -55,20 +55,14 @@ namespace FreeSql.Dameng else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs index b769ec71..67091700 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs @@ -76,20 +76,14 @@ namespace FreeSql.Firebird else if (param is string || param is char) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("timestamp '", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("timestamp '", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("timestamp '", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("timestamp '", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; diff --git a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs index fc9d082c..1e9df8dc 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs @@ -54,24 +54,18 @@ namespace FreeSql.GBase else if (param is string || param is char) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - if (mapColumn?.DbPrecision > 0) - return string.Concat("'", ((DateTime)param).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(mapColumn.DbPrecision, 'f')}"), "'"); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? (mapColumn?.DbPrecision > 0 ? + string.Concat("'", ((DateTime)param).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(mapColumn.DbPrecision, 'f')}"), "'") : + string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'")); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - if (mapColumn?.DbPrecision > 0) - return string.Concat("'", ((DateTime)param).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(mapColumn.DbPrecision, 'f')}"), "'"); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? (mapColumn?.DbPrecision > 0 ? + string.Concat("'", ((DateTime)param).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(mapColumn.DbPrecision, 'f')}"), "'") : + string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'")); else if (param is TimeSpan || param is TimeSpan?) { diff --git a/Providers/FreeSql.Provider.GBase/GBaseUtils.cs b/Providers/FreeSql.Provider.GBase/GBaseUtils.cs index a1331a55..bb31c7e5 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseUtils.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseUtils.cs @@ -102,14 +102,14 @@ namespace FreeSql.GBase } if (type == typeof(DateTime)) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return FormatSql("{0}", typeHandler.Serialize(value), 1); if (col?.DbPrecision > 0) return string.Concat("'", ((DateTime)value).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(col.DbPrecision, 'f')}"), "'"); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } if (type == typeof(DateTime?)) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return FormatSql("{0}", typeHandler.Serialize(value), 1); if (col?.DbPrecision > 0) return string.Concat("'", ((DateTime)value).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(col.DbPrecision, 'f')}"), "'"); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs index f14c1536..c6377d62 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs @@ -53,20 +53,14 @@ namespace FreeSql.KingbaseES else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs index 908e972d..8ac0d0d0 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs @@ -54,19 +54,21 @@ namespace FreeSql.MsAccess else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("cdate('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "')"); } else if (param is DateTime?) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime?), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("cdate('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "')"); } diff --git a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs index 6eac3e07..ff9fa288 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs @@ -58,20 +58,14 @@ namespace FreeSql.MySql else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace('\0', ' '), "'"); else if (param is Enum) - return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs index 50379ff1..8ba353ca 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs @@ -56,20 +56,14 @@ namespace FreeSql.Odbc.Dameng else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs index 0613e5b3..7a9cbfd4 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs @@ -51,9 +51,6 @@ namespace FreeSql.Odbc.Default { if (value == null) return "NULL"; if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); - - if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); - if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString(); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs index 08369cbf..6667e4d2 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs @@ -57,11 +57,13 @@ namespace FreeSql.Odbc.Default else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) - return Adapter.DateTimeRawSql(param); + else if (param is DateTime) + return AddslashesTypeHandler(typeof(DateTime), param) ?? Adapter.DateTimeRawSql(param); + else if (param is DateTime?) + return AddslashesTypeHandler(typeof(DateTime?), param) ?? Adapter.DateTimeRawSql(param); else if (param is TimeSpan || param is TimeSpan?) return Adapter.TimeSpanRawSql(param); else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs index f2d91d3f..7272e22f 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs @@ -56,20 +56,14 @@ namespace FreeSql.Odbc.KingbaseES else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs index e0ec77f3..c39b1dc3 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs @@ -56,26 +56,20 @@ namespace FreeSql.Odbc.MySql else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace('\0', ' '), "'"); else if (param is Enum) - return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; - else if (param is IEnumerable) + else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs index a54c5b2c..1cb2ab72 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs @@ -57,20 +57,14 @@ namespace FreeSql.Odbc.Oracle else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs index 83afa20b..7218c3f2 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs @@ -57,20 +57,14 @@ namespace FreeSql.Odbc.PostgreSQL else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs index 0fdcf5ac..68c78a73 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs @@ -61,19 +61,21 @@ namespace FreeSql.Odbc.SqlServer else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } else if (param is DateTime?) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime?), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } @@ -87,7 +89,7 @@ namespace FreeSql.Odbc.SqlServer return ((TimeSpan)param).TotalSeconds; else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; - else if (param is IEnumerable) + else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); return string.Concat("'", param.ToString().Replace("'", "''"), "'"); diff --git a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs index 2126c54e..f0c4ff7c 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs @@ -54,20 +54,14 @@ namespace FreeSql.Oracle else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs index 4e2c3216..6e964ce5 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs @@ -58,20 +58,14 @@ namespace FreeSql.PostgreSQL else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; @@ -84,10 +78,10 @@ namespace FreeSql.PostgreSQL { var pgdics = isdic ? param as Dictionary : param as IEnumerable>; - + var pghstore = new StringBuilder("'"); var pairs = pgdics.ToArray(); - + for (var i = 0; i < pairs.Length; i++) { if (i != 0) pghstore.Append(","); @@ -99,7 +93,7 @@ namespace FreeSql.PostgreSQL else pghstore.AppendFormat("\"{0}\"", pairs[i].Value.Replace("'", "''")); } - + return pghstore.Append("'::hstore"); } else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs index 81c5c97f..5bcfeee4 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs @@ -60,20 +60,14 @@ namespace FreeSql.QuestDb else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return (long)((TimeSpan)param).TotalSeconds; @@ -86,10 +80,10 @@ namespace FreeSql.QuestDb { var pgdics = isdic ? param as Dictionary : param as IEnumerable>; - + var pghstore = new StringBuilder("'"); var pairs = pgdics.ToArray(); - + for (var i = 0; i < pairs.Length; i++) { if (i != 0) pghstore.Append(","); @@ -101,7 +95,7 @@ namespace FreeSql.QuestDb else pghstore.AppendFormat("\"{0}\"", pairs[i].Value.Replace("'", "''")); } - + return pghstore.Append("'::hstore"); } else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs index d217fc3e..240d7b49 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs @@ -54,20 +54,14 @@ namespace FreeSql.ShenTong else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs index 98bc119f..426f09ef 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs @@ -65,19 +65,21 @@ namespace FreeSql.SqlServer else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } else if (param is DateTime?) { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + var result = AddslashesTypeHandler(typeof(DateTime?), param); + if (result != null) return result; if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs index fa851020..89670b97 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs @@ -59,20 +59,14 @@ namespace FreeSql.Sqlite else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; diff --git a/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs b/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs index 81ea7144..fd2d9340 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs @@ -56,21 +56,15 @@ namespace FreeSql.Xugu else if (param is char) return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; else if (param is DateTime) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } + return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is DateTime?) - { - if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); - return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - } - + return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[])