IBatis.net 获取记录数之道 -- 迂回

欲练此功,必先自宫。
欲分页,必先获取记录数。

IBatis简单却又强大,然而用过IBatis的人都之道,在IBatis里想通过查询列表的SQL去获取记录数却不是件容易的事情,我在网上搜了N次没有搜到。

思路:
要想获取记录数(不特意写SQL),必须先获取到所执行的最终的SQL语句,并在外面包一层 select count(*)  from (原始sql) 来做;
研究了一下SDK,发现获取最终执行的SQL语句是不可能的,但可以从里面得到 IDbCommand 和 IDbConnection,IDbCommand 的参数都已经准备好,我们只要串改一下CommandText,就豁然开朗了:

public static int QueryForCount(string statementName, object paramObject) {
        ISqlMapper mapper 
= Mapper.Instance();
        IMappedStatement statement 
= mapper.GetMappedStatement(statementName);
        IDbCommand cmd 
= null;
        
try {
            
if (!mapper.IsSessionStarted) {
                mapper.OpenConnection();
            }

            RequestScope scope 
= statement.Statement.Sql.GetRequestScope(statement, paramObject, mapper.LocalSession);
            statement.PreparedCommand.Create(scope, mapper.LocalSession, statement.Statement, paramObject);
            cmd 
= scope.IDbCommand;
            cmd.Connection 
= scope.Session.Connection;

            cmd.CommandText 
= string.Format("select count(*) c from ({0}) t ", cmd.CommandText);
            
using (IDataReader dr = cmd.ExecuteReader()) {
                dr.Read();
                
return dr.GetInt32(0);
            }

        }
 finally {
            
if( cmd != null && cmd.Connection != null && cmd.Connection.State != ConnectionState.Closed)
                cmd.Connection.Close();
        }
 
    }

希望对大家有用。
posted @   quitgame  阅读(1956)  评论(5编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示