.NET 6中ExecuteSqlRawAsync执行含JSON的SQL报格式错误如何解决
问题根因
ExecuteSqlRawAsync 会把传入的第一个字符串按C#复合格式规则解析,将{数字}格式的片段识别为参数占位符,匹配方法后续传入的参数列表。你SQL中的JSON片段包含大量{、}字符,会被误识别为占位符标记,因无对应参数传入,最终抛出格式错误异常。
可用修复方案
任选一种即可:
- 转义大括号:按照C#复合格式转义规则,把脚本内所有单个
{替换为{{、单个}替换为}},即可被正常解析。缺点是JSON内容多的时候替换成本高,后续维护脚本麻烦。 - 把脚本作为参数传入:不要直接把脚本作为格式化串传入,将整段脚本作为索引0的参数传递,彻底避免解析脚本内部的大括号,改动最小:
await context.Database.ExecuteSqlRawAsync("{0}", script); - 用原生ADO.NET执行(推荐批量脚本场景使用):绕开EF Core的SQL格式化逻辑,直接调用底层数据库连接的命令执行接口,对原生SQL兼容性最好,不会出现格式解析问题:
注意:如果你的SQL脚本里包含SSMS生成的var conn = context.Database.GetDbConnection(); await conn.OpenAsync(); using var cmd = conn.CreateCommand(); cmd.CommandText = script; await cmd.ExecuteNonQueryAsync();GO分隔符,需要先按GO拆分语句分段执行,你给出的示例脚本无GO,可直接执行。
内容的提问来源于stack exchange,提问作者irfanmcsd
相关产品推荐
相关产品推荐

