/// <summary> /// 异步执行分页查询 /// 注意,SQL语句中一定要包含ORDER BY子句 /// </summary> /// <param name="command">DbCommand</param> /// <param name="preparePagingCommand">分页语句后续处理</param> /// <param name="pageIndex">第几页</param> /// <param name="pageSize">每页记录数</param> /// <returns>PagingResult</returns> public virtual async Task <PagingResult <DbDataReader> > ExecuteReaderPagingAsync( DbCommand command, Action <DbCommand, DatabaseAccess> preparePagingCommand, int pageIndex, int pageSize) { bool lastOpenedConnection = _openedConnection; bool isOpen = false; CommandBehavior behavior = CommandBehavior.Default; try { await EnsureConnectionAsync(); isOpen = lastOpenedConnection != _openedConnection; if (isOpen) { behavior = CommandBehavior.CloseConnection; } var rowCountTask = ReaderRowCountAsync(command, pageIndex, pageSize); var pagingReaderTask = ExecutePagingDataReader(command, preparePagingCommand, pageIndex, pageSize, behavior); int rowCount = await rowCountTask; DbDataReader reader = await pagingReaderTask; ReleaseConnection(false); PagingResult <DbDataReader> result = new PagingResult <DbDataReader> { Result = reader, RowCount = rowCount, PageCount = PageCount(rowCount, pageSize) }; return(result); } catch { if (isOpen) { ReleaseConnection(); } else { ReleaseConnection(false); } throw; } }
/// <summary> /// 执行分页查询 /// 注意,SQL语句中一定要包含ORDER BY子句 /// </summary> /// <typeparam name="TResult">返回数据集的类型,该类型必须有空构造</typeparam> /// <param name="command">DbCommand</param> /// <param name="preparePagingCommand">分页语句后续处理</param> /// <param name="readDataHandler">DbDataReader和数据集映射的委托</param> /// <param name="pageIndex">第几页</param> /// <param name="pageSize">每页记录数</param> /// <returns>PagingResult数据集</returns> public virtual async Task <PagingResult <TResult> > ExecuteReaderPagingAsync <TResult>( DbCommand command, Action <DbCommand, DatabaseAccess> preparePagingCommand, Action <TResult, DbDataReader> readDataHandler, int pageIndex, int pageSize) where TResult : new() { try { await EnsureConnectionAsync(); var rowCountTask = ReaderRowCountAsync(command, pageIndex, pageSize); var pagingReaderTask = ExecutePagingDataReader(command, preparePagingCommand, pageIndex, pageSize, CommandBehavior.Default); int rowCount = await rowCountTask; DbDataReader reader = await pagingReaderTask; TResult resultData = LoadResult <TResult>(reader, readDataHandler); PagingResult <TResult> result = new PagingResult <TResult> { Result = resultData, RowCount = rowCount, PageCount = PageCount(rowCount, pageSize) }; return(result); } catch { throw; } finally { ReleaseConnection(); } }