ado.net/dapper 的多sql语句执行的疑惑

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创,首发于 【掘金】
  • 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪

1. Query 和Execute方法

大家经常使用Dapper或者Ado.net,会很自然的区分使用Query 和Execute,一般把查询放在Query方法内执行,而把insert \ update \ delete,存储过程等语句放在Execute内执行,那么有时候需要执行几条语句,如果是查询和增删改查混合的语句,到底放在哪个方法内执行呢?

由于Execute不能返回查询结果,ExecuteScalar虽然能返回结果,也仅仅是第一行数据的第一列,那么好像看起来只能放在Query内执行了,看起来在Query内执行增删改,心里总是有些忐忑不安。

当然,切分成2条语句去执行,当时是没有问题的,只是稍微增加了些网络来回而已。

2. 一个例子场景

说了半天,到底是什么样的场景呢?

这里就有一个场景,需要在查询数据时更新列(最后访问时间)的日期为访问时日期,如果不采用触发器和存储过程,那么最好用的方法就是下属语句了:

var d = conn.QueryFirstOrDefault(
"update public.test set dt= now() where id=1;select * from public.test where id=1;"
);

是的,采用Dapper,就能够正确的执行,并且返回正确的查询结果。ADO.net我没有测试。

3. 为了解决疑惑,问问大神们?

我在dapper的Issues内提交了一个问题,希望大神们能注意到这个疑惑,很快就得到了成员 @mgravell的答复:

Dapper不在乎你在命令中做什么。您可以执行 27 个操作,然后返回数据列表,一切由您决定。

您在这里显示的内容,通过更新然后获取整个行,在某些情况下非常常见的。

4 .没问题, 绝对没问题

你最终确实有一个列表返回, 所以: 没问题, 绝对没问题

请注意,某些数据库在单个操作中支持此操作,例如,在 TSQL 中,这将是:

update public.test
set dt= GETUTCDATE()
output inserted.*
where id=1;

但是,如果您的 RDBMS 允许,在查询中单独的子命令是可以的。

感谢@mgravell的回复,他解决了我的疑惑,并能让我快乐的使用多个命令的组合完成工作。

5. 小结

一次搞定修改和查询,我感觉触发了新的快乐源泉,赶紧把Dapper用起来吧!小伙子们。

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:博客之星2020 设计师:CSDN官方博客 返回首页

打赏作者

webmote

如果能帮到你,请支持下博主

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值