Exemplo n.º 1
0
        /// <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;
            }
        }
Exemplo n.º 2
0
        /// <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();
            }
        }