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

Home Page:https://www.donet5.com/Home/Doc

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

自定义SQL参数化问题

kaizhou92 opened this issue · comments

版本: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

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

不需要你自个处理

不管是oracle pgsql sqlserver 都是@

还有疑问发新的isssue先关闭