案例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());
}
版本: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