You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EF Core ExecuteSqlRawAsync存储JSON字符串时出现格式错误的问题咨询

解决EF Core 3.1 ExecuteSqlRawAsync存储JSON字符串时的格式错误问题

你遇到的这个错误,核心原因是EF Core的ExecuteSqlRawAsync会把SQL语句里的{}当成参数占位符来解析,而你JSON字符串里的{"property1":"value1"...}刚好包含单个花括号,EF会误以为这是参数标记,从而抛出格式错误——虽然直接在SQL Server里执行没问题,但EF的SQL解析逻辑会优先处理这些花括号。

下面给你两种可行的解决方案:

方案一:转义JSON中的花括号

把JSON里的每个{替换成{{,每个}替换成}},这样EF会将其解析为普通的花括号,而不是参数占位符。修改后的代码如下:

string query = "update mytable set column1 = 100, column2= '[{{\"property1\":\"value1\",\"property2\":null}}]' where condition;update mytable set column1= 200, column2= '[{{\"property1\":\"value2\",\"property\":null}}]' where condition;"
await this.Context.Database.ExecuteSqlRawAsync(query);

EF Core会自动把{{转译为{,}}转译为},最终发送到数据库的SQL就是你原本期望的正确JSON格式。

方案二:使用参数化查询(推荐)

直接拼接SQL字符串不仅容易遇到解析问题,还存在SQL注入风险。更规范的做法是把JSON字符串作为参数传入,示例代码如下:

// 定义要存储的JSON字符串
var jsonValue1 = "[{\"property1\":\"value1\",\"property2\":null}]";
var jsonValue2 = "[{\"property1\":\"value2\",\"property\":null}]";

// 编写带参数占位符的SQL语句
string query = @"
update mytable set column1 = 100, column2 = @JsonVal1 where condition;
update mytable set column1 = 200, column2 = @JsonVal2 where condition;";

// 传入参数执行查询
await this.Context.Database.ExecuteSqlRawAsync(query, 
    new SqlParameter("@JsonVal1", jsonValue1),
    new SqlParameter("@JsonVal2", jsonValue2));

这种方法既规避了EF对花括号的解析问题,又能有效防止SQL注入,尤其适合JSON内容来自外部输入的场景。

补充说明:EF Core 3.1的RawSql系列方法(包括ExecuteSqlRawAsync)确实会对单花括号做特殊处理,用来支持索引式参数(比如{0}、{1}),所以直接包含单花括号的字符串会触发解析错误,通过转义或参数化就能完美解决这个问题。

内容的提问来源于stack exchange,提问作者Vikash Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:07:38