T·Lv2 2024-05-19 20:20 采纳率: 50%
浏览 8
已结题

EF core 直接执行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()方法。
望解答,感谢!

  • 写回答

5条回答 默认 最新

  • T·Lv2 2024-05-20 10:29
    关注

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

    img


    所执行的SQL如下

    img


    问题解决,感谢大家

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 求解决为什么json数据完整,却解析失败
  • ¥15 打开Smart schedule运行examples/transformer-xl/scripts/run_enwik8_base_moe.sh 报错
  • ¥15 求一个C# sm4 加密解密的代码
  • ¥15 想做个网络加速器,怎么实现
  • ¥20 centos7下载mysql提示DNS解析异常
  • ¥20 vx转账功能对方不能领取
  • ¥15 vue2+codemirror 运行后页面光标太大了
  • ¥15 pdfjs库如何在前端实现打印、旋转等功能
  • ¥15 combobox数据绑定问题
  • ¥15 maven打包时,为什么有的依赖打不进去包