From 3aec26337a6c9b7bc7604665e2b7cfbba2b4fefc Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 24 Nov 2020 00:17:12 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20=20IN=20=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=89=A9=E5=B1=95=20where=20id=20in=20@ids=EF=BC=9B#5?= =?UTF-8?q?60?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySqlConnectorAdo/MySqlAdoTest.cs | 2 + .../Dameng/DamengAdo/DamengAdoTest.cs | 2 + .../Firebird/ExtensionsAdo/FirebirdAdoTest.cs | 2 + .../KingbaseESAdo/KingbaseESAdoTest.cs | 2 + .../MsAccess/MsAccessAdo/MsAccessAdoTest.cs | 2 + .../MySql/MySqlAdo/MySqlAdoTest.cs | 2 + .../Oracle/OracleAdo/OracleAdoTest.cs | 2 + .../PostgreSQLAdo/PostgreSQLAdoTest.cs | 2 + .../ShenTong/ShenTongAdo/ShenTongAdoTest.cs | 2 + .../SqlServerAdo/SqlServerAdoTest.cs | 2 + .../Sqlite/SqliteAdo/SqliteAdoTest.cs | 2 + FreeSql/FreeSql.xml | 402 ++++++++++-------- .../CommonProvider/AdoProvider/AdoProvider.cs | 28 +- .../AdoProvider/AdoProviderAsync.cs | 20 +- .../FreeSql.Provider.Dameng/DamengUtils.cs | 31 +- .../FreeSql.Provider.Oracle/OracleUtils.cs | 6 +- .../FreeSql.Provider.Sqlite/SqliteUtils.cs | 30 +- 17 files changed, 322 insertions(+), 217 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorAdo/MySqlAdoTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorAdo/MySqlAdoTest.cs index 2b3d9f5c..e87dac33 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorAdo/MySqlAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlConnectorAdo/MySqlAdoTest.cs @@ -64,6 +64,8 @@ namespace FreeSql.Tests.MySqlConnector var t4 = g.mysql.Ado.Query<(int, string, string)>("select * from song"); var t5 = g.mysql.Ado.Query("select * from song"); + + var t6 = g.mysql.Ado.Query("select * from song where id in @ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengAdo/DamengAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengAdo/DamengAdoTest.cs index 01f589f6..5bf7503f 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengAdo/DamengAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengAdo/DamengAdoTest.cs @@ -53,6 +53,8 @@ namespace FreeSql.Tests.Dameng var t4 = g.dameng.Ado.Query<(int, string, string)>("select * from \"TB_TOPIC\""); var t5 = g.dameng.Ado.Query("select * from \"TB_TOPIC\""); + + var t6 = g.dameng.Ado.Query("select * from \"TB_TOPIC\" where \"ID\" in @ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/ExtensionsAdo/FirebirdAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/ExtensionsAdo/FirebirdAdoTest.cs index 2ddeab02..5701d1d8 100644 --- a/FreeSql.Tests/FreeSql.Tests/Firebird/ExtensionsAdo/FirebirdAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Firebird/ExtensionsAdo/FirebirdAdoTest.cs @@ -53,6 +53,8 @@ namespace FreeSql.Tests.Firebird var t4 = g.firebird.Ado.Query<(int, string, string)>("select * from \"TB_TOPIC22\""); var t5 = g.firebird.Ado.Query("select * from \"TB_TOPIC22\""); + + var t6 = g.firebird.Ado.Query("select * from \"TB_TOPIC22\" where \"ID\" in @ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESAdo/KingbaseESAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESAdo/KingbaseESAdoTest.cs index ad9c7cf5..5c319ed3 100644 --- a/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESAdo/KingbaseESAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESAdo/KingbaseESAdoTest.cs @@ -48,6 +48,8 @@ namespace FreeSql.Tests.KingbaseES var t4 = g.kingbaseES.Ado.Query<(int, string, string)>("select * from \"TB_TOPIC\""); var t5 = g.kingbaseES.Ado.Query("select * from \"TB_TOPIC\""); + + var t6 = g.kingbaseES.Ado.Query("select * from TB_TOPIC where id in @ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessAdo/MsAccessAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessAdo/MsAccessAdoTest.cs index 3e6ba0ef..b64a7bf7 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessAdo/MsAccessAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessAdo/MsAccessAdoTest.cs @@ -59,6 +59,8 @@ namespace FreeSql.Tests.MsAccess var t4 = g.msaccess.Ado.Query<(int, string, string)>("select * from [song]"); var t5 = g.msaccess.Ado.Query("select * from [song]"); + + var t6 = g.msaccess.Ado.Query("select * from song where id in @ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs index 3ba3a825..7f24092d 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs @@ -52,6 +52,8 @@ namespace FreeSql.Tests.MySql var t4 = g.mysql.Ado.Query<(int, string, string)>("select * from song"); var t5 = g.mysql.Ado.Query("select * from song"); + + var t6 = g.mysql.Ado.Query("select * from song where id in ?ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs index ae86f397..8997a6b5 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs @@ -53,6 +53,8 @@ namespace FreeSql.Tests.Oracle var t4 = g.oracle.Ado.Query<(int, string, string)>("select * from \"TB_TOPIC\""); var t5 = g.oracle.Ado.Query("select * from \"TB_TOPIC\""); + + var t6 = g.oracle.Ado.Query("select * from TB_TOPIC where id in :ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLAdo/PostgreSQLAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLAdo/PostgreSQLAdoTest.cs index aef0967d..14e74edf 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLAdo/PostgreSQLAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLAdo/PostgreSQLAdoTest.cs @@ -54,6 +54,8 @@ namespace FreeSql.Tests.PostgreSQL var t4 = g.pgsql.Ado.Query<(int, string, string)>("select * from xxx"); var t5 = g.pgsql.Ado.Query("select * from xxx"); + + var t6 = g.pgsql.Ado.Query("select * from xxx where id in @ids", new { ids = new[] { "1", "2", "3" } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongAdo/ShenTongAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongAdo/ShenTongAdoTest.cs index dd62f210..712e5894 100644 --- a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongAdo/ShenTongAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongAdo/ShenTongAdoTest.cs @@ -54,6 +54,8 @@ namespace FreeSql.Tests.ShenTong var t4 = g.shentong.Ado.Query<(int, string, string)>("select * from xxx"); var t5 = g.shentong.Ado.Query("select * from xxx"); + + var t6 = g.shentong.Ado.Query("select * from xxx where id in @ids", new { ids = new[] { "1", "2", "3" } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerAdo/SqlServerAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerAdo/SqlServerAdoTest.cs index 6a01369e..8c4c4c42 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerAdo/SqlServerAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerAdo/SqlServerAdoTest.cs @@ -95,6 +95,8 @@ namespace FreeSql.Tests.SqlServer var t5 = g.sqlserver.Ado.Query("select * from xxx where Id = @Id", new Dictionary { ["id"] = 1 }); + + var t6 = g.sqlserver.Ado.Query("select * from xxx where id in @ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteAdo/SqliteAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteAdo/SqliteAdoTest.cs index 004aec54..b7ce8564 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteAdo/SqliteAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteAdo/SqliteAdoTest.cs @@ -59,6 +59,8 @@ namespace FreeSql.Tests.Sqlite var t4 = g.sqlite.Ado.Query<(int, string, string)>("select * from \"song\""); var t5 = g.sqlite.Ado.Query("select * from \"song\""); + + var t6 = g.sqlite.Ado.Query("select * from song where id in @ids", new { ids = new[] { 1, 2, 3 } }); } [Fact] diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5140edee..837f0039 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3089,177 +3089,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> - - - - - - - - 可自定义解析表达式 @@ -4088,12 +3917,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4164,12 +3987,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 @@ -4785,3 +4602,222 @@ +ystem.Boolean}})"> + + 使用 and 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 将 lambda 表达式取反 + + + true 时生效 + + + + + 使用 and 拼接两个 lambda 表达式 + + + + + + 使用 and 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 将 lambda 表达式取反 + + + true 时生效 + + + + + 生成类似Mongodb的ObjectId有序、不重复Guid + + + + + + 插入数据 + + + + + + + 插入数据,传入实体 + + + + + + + + 插入数据,传入实体数组 + + + + + + + + 插入数据,传入实体集合 + + + + + + + + 插入数据,传入实体集合 + + + + + + + + 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: + 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/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 6abba992..7cbcfb9e 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -1,14 +1,16 @@ -using FreeSql.Internal.ObjectPool; +using FreeSql.Internal.Model; +using FreeSql.Internal.ObjectPool; using System; -using System.Collections.Generic; +using System.Collections; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Diagnostics; using System.Linq; -using System.Text; using System.Reflection; -using FreeSql.Internal.Model; +using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.Internal.CommonProvider { @@ -849,8 +851,24 @@ namespace FreeSql.Internal.CommonProvider foreach (var parm in cmdParms) { if (parm == null) continue; + var isnew = false; if (parm.Value == null) parm.Value = DBNull.Value; - cmd.Parameters.Add(parm); + else + { + if (parm.Value is Array || parm.Value is IList) + { + cmd.CommandText = Regex.Replace(cmd.CommandText, @"\s+(in|In|IN|iN)\s+[\:\?\@]" + parm.ParameterName.TrimStart('@', '?', ':'), m => + { + isnew = true; + var arr = parm.Value as IEnumerable; + if (arr == null) return " IS NULL"; + var vals = new List(); + foreach (var val in arr) vals.Add(val); + return $" in {_util.FormatSql("{0}", new object[] { vals })}"; + }); + } + } + if (isnew == false) cmd.Parameters.Add(parm); } } diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index f6d6bab5..cc9a3d05 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -1,11 +1,13 @@ using FreeSql.Internal.Model; using FreeSql.Internal.ObjectPool; using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -755,8 +757,24 @@ namespace FreeSql.Internal.CommonProvider foreach (var parm in cmdParms) { if (parm == null) continue; + var isnew = false; if (parm.Value == null) parm.Value = DBNull.Value; - cmd.Parameters.Add(parm); + else + { + if (parm.Value is Array || parm.Value is IList) + { + cmd.CommandText = Regex.Replace(cmd.CommandText, @"\s+(in|In|IN|iN)\s+[\:\?\@]" + parm.ParameterName.TrimStart('@', '?', ':'), m => + { + isnew = true; + var arr = parm.Value as IEnumerable; + if (arr == null) return " IS NULL"; + var vals = new List(); + foreach (var val in arr) vals.Add(val); + return $" in {_util.FormatSql("{0}", new object[] { vals })}"; + }); + } + } + if (isnew == false) cmd.Parameters.Add(parm); } } diff --git a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs index d8faa6f5..07400898 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs @@ -41,22 +41,27 @@ namespace FreeSql.Dameng public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, null, (name, type, value) => { - var dbtype = (DmDbType)_orm.CodeFirst.GetDbInfo(type)?.type; - switch (dbtype) + var typeint = _orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = typeint != null ? (DmDbType?)typeint : null; + if (dbtype != null) { - case DmDbType.Bit: - if (value == null) value = null; - else value = (bool)value == true ? 1 : 0; - dbtype = DmDbType.Int32; - break; + switch (dbtype) + { + case DmDbType.Bit: + if (value == null) value = null; + else value = (bool)value == true ? 1 : 0; + dbtype = DmDbType.Int32; + break; - case DmDbType.Char: - case DmDbType.VarChar: - case DmDbType.Text: - value = string.Concat(value); - break; + case DmDbType.Char: + case DmDbType.VarChar: + case DmDbType.Text: + value = string.Concat(value); + break; + } } - var ret = new DmParameter { ParameterName = $":{name}", DmSqlType = dbtype, Value = value }; + var ret = new DmParameter { ParameterName = $":{name}", Value = value }; + if (dbtype != null) ret.DmSqlType = dbtype.Value; return ret; }); diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 9d66f317..479d77b4 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -54,14 +54,16 @@ namespace FreeSql.Oracle public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, ":", (name, type, value) => { - var dbtype = (OracleDbType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtypeint = _orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = dbtypeint != null ? (OracleDbType?)dbtypeint : null; if (dbtype == OracleDbType.Boolean) { if (value == null) value = null; else value = (bool)value == true ? 1 : 0; dbtype = OracleDbType.Int16; } - var ret = new OracleParameter { ParameterName = $":{name}", OracleDbType = dbtype, Value = value }; + var ret = new OracleParameter { ParameterName = $":{name}", Value = value }; + if (dbtype != null) ret.OracleDbType = dbtype.Value; return ret; }); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs index ffdbb89c..1915d8b8 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs @@ -44,23 +44,27 @@ namespace FreeSql.Sqlite public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, "@", (name, type, value) => { - var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type; - switch (dbtype) + var typeint = _orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = typeint != null ? (DbType?)typeint : null; + if (dbtype != null) { - case DbType.Guid: - if (value == null) value = null; - else value = ((Guid)value).ToString(); - dbtype = DbType.String; - break; - case DbType.Time: - if (value == null) value = null; - else value = ((TimeSpan)value).Ticks / 10000; - dbtype = DbType.Int64; - break; + switch (dbtype.Value) + { + case DbType.Guid: + if (value == null) value = null; + else value = ((Guid)value).ToString(); + dbtype = DbType.String; + break; + case DbType.Time: + if (value == null) value = null; + else value = ((TimeSpan)value).Ticks / 10000; + dbtype = DbType.Int64; + break; + } } var ret = new SQLiteParameter(); ret.ParameterName = $"@{name}"; - ret.DbType = dbtype; + if (dbtype != null) ret.DbType = dbtype.Value; ret.Value = value; return ret; });