Exemple #1
0
        /// <summary>
        /// 获取数据页
        /// </summary>
        /// <param name="querySql">查询语句</param>
        /// <param name="parameters">参数</param>
        /// <param name="page">分页信息</param>
        /// <returns>数据页</returns>
        public DataPage GetDataPage(string querySql, List <DataParameter> parameters, DataPage page)
        {
            try
            {
                if (page.AccuratePartition == true &&
                    string.IsNullOrEmpty(page.KeyName) == true)
                {
                    throw new Exception("精确分页时,未指定分页主键。");
                }

                page.Result = null;

                Action <IDbConnection, IDbTransaction> GetCountMethod = new Action <IDbConnection, IDbTransaction>((conn, trans) =>
                {
                    //得到记录总数
                    string sqlCount;
                    if (string.IsNullOrEmpty(page.CountSql) == true)
                    {
                        sqlCount = "select count(*) from (" + querySql + ") page_tbl";
                    }
                    else
                    {
                        sqlCount = page.CountSql;
                    }

                    object returnObject = this.DbHelper.ExecuteScalar(sqlCount, parameters, conn, trans);

                    //设置总记录数
                    if (returnObject == null)
                    {
                        page.RecordCount = 0;
                    }
                    else
                    {
                        page.RecordCount = Convert.ToInt32(returnObject);
                    }

                    #region 设置分页属性

                    if (page.RecordCount == 0)
                    {
                        page.PageIndex = 1;
                    }

                    if (page.RecordCount % page.PageSize != 0)
                    {
                        page.PageCount = page.RecordCount / page.PageSize + 1;
                        if (page.PageCount < page.PageIndex)
                        {
                            page.PageIndex = page.PageCount;
                        }
                    }
                    else
                    {
                        page.PageCount = page.RecordCount / page.PageSize;
                    }

                    if (page.PageCount < page.PageIndex)
                    {
                        page.PageIndex = page.PageCount;
                    }

                    #endregion
                });

                Action <IDbConnection, IDbTransaction> GetDataMethod = new Action <IDbConnection, IDbTransaction>((conn, trans) =>
                {
                    //获取分页语句
                    string sqlData = "";

                    if (string.IsNullOrEmpty(page.SortExpression) == true)
                    {
                        page.SortExpression = page.KeyName;
                    }

                    if (string.IsNullOrEmpty(page.SortExpression) == true)
                    {
                        throw new Exception("未设置排序表达式");
                    }

                    if (page.AccuratePartition == true &&
                        page.SortExpression.IndexOf(page.KeyName) < 0)
                    {
                        page.SortExpression += "," + page.KeyName;
                    }

                    switch (this.DbType)
                    {
                    case DataBaseType.SqlServer:
                        sqlData = this.GetSqlServerSql(querySql, page, page.SortExpression);
                        break;

                    case DataBaseType.Oracle:
                        sqlData = this.GetOracleSql(querySql, page, page.SortExpression);
                        break;

                    case DataBaseType.MySql:
                        sqlData = this.GetMySqlSql(querySql, page, page.SortExpression);
                        break;
                    }

                    if (string.IsNullOrEmpty(sqlData) == true)
                    {
                        throw new Exception("不支持对" + this.DbType.ToString() + "数据库的后台分页查询!");
                    }

                    //获取数据
                    DataTable resultTable = new DataTable();
                    resultTable.TableName = "PageTable";
                    this.DbHelper.FillDataTable(resultTable, sqlData, parameters, conn, null);
                    page.Result = resultTable;
                });

                if (page.IsParallel)
                {
                    using (IDbConnection conn1 = DbManager.GetCon(this.ConnInfo.DbKey, true))
                    {
                        IAsyncResult iarGetCount             = GetCountMethod.BeginInvoke(conn1, null, null, null);
                        IAsyncResult iarGetData              = GetDataMethod.BeginInvoke(this.Connection, null, null, null);
                        System.Threading.WaitHandle[] events = { iarGetCount.AsyncWaitHandle, iarGetData.AsyncWaitHandle };
                        System.Threading.WaitHandle.WaitAll(events);
                        GetDataMethod.EndInvoke(iarGetData);
                        GetCountMethod.EndInvoke(iarGetCount);
                    }
                }
                else
                {
                    GetCountMethod(this.Connection, this.Transaction);
                    if (page.RecordCount > 0)
                    {
                        GetDataMethod(this.Connection, this.Transaction);
                    }
                }

                return(page);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Exemple #2
0
        /// <summary>
        /// 按页获取数据
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="sql">查询语句</param>
        /// <param name="parameters">参数</param>
        /// <param name="page">分页信息</param>
        /// <returns>数据页(实体列表)</returns>
        public virtual DataPage GetDataPage <T>(string sql, DataParameter[] parameters, DataPage page) where T : new()
        {
            IList <T> list = null;

            try
            {
                this.GetDataPage(sql, parameters, page);

                if (page.Result != null)
                {
                    list = ConvertToList <T>(page.Result as DataTable);
                }
                else
                {
                    list = new List <T>();
                }
                page.Result = list;

                return(page);
            }
            catch (Exception ex)
            {
                this.RollbackTs();
                throw ex;
            }
            finally
            {
                this.CloseCon();
            }
        }