DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.19k stars 1.32k forks source link

自定义SQL参数化问题 #1184

Closed kaizhou92 closed 10 months ago

kaizhou92 commented 10 months ago

版本:5.1.4.98

背景:针对同一段SQL语句,可以支持多个数据库执行,目前卡在数组参数化 使用SQLlite

案例SQL: SELECT A.a FROM A WHERE A.a IN (:aa) var param = new SugarParameter[] { new SugarParameter("aa", new string[]{"0","1"}) }; 执行到 【OnExecutingChangeSql】发现 sql 变成了SELECT A.a FROM A WHERE A.a IN (:'0','1') 笔者想在此次将:aa 转换为@aa

查看源码后发现【AdoProvider】->【InitParameters】 中 内容替换了

if (item.ParameterName.Substring(0, 1) != this.SqlParameterKeyWord && sql.ObjToString().Contains(this.SqlParameterKeyWord + item.ParameterName)) { sql = sql.Replace(this.SqlParameterKeyWord + item.ParameterName, newValues.ToArray().ToJoinSqlInVals()); } else if (item.Value!=null&&UtilMethods.IsNumberArray(item.Value.GetType())) { if (newValues.Any(it => it == "")) { newValues.RemoveAll(r => r == ""); newValues.Add("null"); } sql = sql.Replace(item.ParameterName, string.Join(",", newValues)); } else { sql = sql.Replace(item.ParameterName, newValues.ToArray().ToJoinSqlInVals()); }

建议: 能不能在 底层 增加【执行InitParameters前】的AOP事件 可以去修改sql语句 或者将【OnExecutingChangeSql】前置

在InitParameters 中遇到数组类型参数时,由于没匹配到【:】或者【@】,而将内容之间替换了,这块内容替换应该是在【OnExecutingChangeSql】进行处理吧

目前笔者系统的解决方法,包了一层 将sql修改后,再调用SqlQueryable

DotNetNext commented 10 months ago

sqlsugar不是自带的就支持吗? 所有SQL只需要用@

DotNetNext commented 10 months ago

不需要你自个处理

DotNetNext commented 10 months ago

不管是oracle pgsql sqlserver 都是@

DotNetNext commented 10 months ago

还有疑问发新的isssue先关闭