• 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由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用起来吧!小伙子们。

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

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

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐