ado.net/dapper 的多sql语句执行的疑惑
????欢迎点赞 :???? 收藏 ⭐留言 ???? 如有错误敬请指正,赐人玫瑰,手留余香!????本文作者:由webmote 原创,首发于 【掘金】????作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!????????????1. Query 和Execute方法大家经常使用Dapper或者Ado.net,会很自然的区分使用Query 和Execute,一般把查询
- 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
- 📢本文作者:由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用起来吧!小伙子们。
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?
更多推荐
所有评论(0)