ED CORE ctx.Database.ExecuteSqlInterpolatedAsync()执行SQL更新数据出现问题

环境:.net 5 和Oracle 11g
问题:在EF CORE 使用ctx.Database.ExecuteSqlInterpolatedAsync()方法更新数据时,因为这个方法会自动吧内插值转化为SQL占位符执行,所以出现了以外的错误(并非代码报错),代码如下图

img

主要看下面的那条for循环的插入语句(代码无错误!!)。
为了方便展示只更新了一次,实际上我是想,把所有Title列是Title5的数据变成 j+Title的形式,但是由于使用了{j}来向SQL字符串中传入数据,所以导致自动转换为占位符,导致插入了“:p0Title”这个样子的数据,
发送LOG后看到SQL代码如下图

img


一对比就会发现第一个{j}部分变成了 :p0,这没问题,占位符嘛,但是!插入之后表中数据直接就变成了:p0Title,关键是!后面的Id={j} 没有问题,正确的找到了Id(我觉得可能是因为第一个{j}后面有字符的原因),所以想问一下这种样子怎么在这个代码或者这个思想的基础上,把代码变正确
依旧要使用ctx.Database.ExecuteSqlInterpolatedAsync()方法,因为同样的代码我在使用ctx.Database.ExecuteSqlRawAsync()方法后就成功了(我知道是因为他会直接穿完整的不修改的字符),但是ctx.Database.ExecuteSqlRawAsync()不能防止SQL注入漏洞攻击,所以想要依旧使用ctx.Database.ExecuteSqlInterpolatedAsync()方法。
望解答,感谢!

问题解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

问题解决了,应该是两点问题1:如果字符串SQL语句需要等于号后面有内插值(例如 Title= 某个有内插值的表达式,就像问题的代码一样),最好直接在SQL语句之前就拼接完成完整的变量,把整个等号后面直接变成一个内插值,而不是有内插值的表达式。
2:在字符串SQL中如果等于号后面是字符串类型的,那么使用内插值时不需要在内插值当中加单引号(’ ‘),估计时EFCORE会自动识别变量时字符串类型,代码如下:

img


所执行的SQL如下

img


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值