Ejemplo n.º 1
0
        private IDataReader ExecuteDataReader(OQL oql, AdoHelper db)
        {
            string sql = "";

            sql = oql.ToString();

            //处理实体类分页 2010.6.20
            if (oql.PageEnable)
            {
                //处理分页统前的记录数量统计问题 感谢网友 @成都-小兵 发现此问题
                if (oql.PageWithAllRecordCount == 0)
                {
                    object oValue = EntityQueryAnonymous.ExecuteOQLCount(oql, db);
                    oql.PageWithAllRecordCount = CommonUtil.ChangeType <int>(oValue);
                }

                switch (db.CurrentDBMSType)
                {
                case PWMIS.Common.DBMSType.Access:
                case PWMIS.Common.DBMSType.SqlServer:
                case PWMIS.Common.DBMSType.SqlServerCe:
                    if (oql.haveJoinOpt)
                    {
                        if (oql.PageNumber <= 1)     //仅限定记录条数
                        {
                            sql = "Select Top " + oql.PageSize + " " + sql.Trim().Substring("SELECT ".Length);
                        }
                        else     //必须采用复杂分页方案
                        {
                            //edit at 2012.10.2 oql.PageWithAllRecordCount
                            sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.SqlServer, sql, "", oql.PageSize, oql.PageNumber, oql.PageWithAllRecordCount);
                        }
                    }
                    else
                    {
                        //单表查询的情况
                        if (oql.PageOrderDesc)
                        {
                            sql = PWMIS.Common.SQLPage.GetDescPageSQLbyPrimaryKey(oql.PageNumber, oql.PageSize, oql.sql_fields, oql.sql_table, oql.PageField, oql.sql_condition);
                        }
                        else
                        {
                            sql = PWMIS.Common.SQLPage.GetAscPageSQLbyPrimaryKey(oql.PageNumber, oql.PageSize, oql.sql_fields, oql.sql_table, oql.PageField, oql.sql_condition);
                        }
                    }

                    break;

                case PWMIS.Common.DBMSType.Oracle:
                    sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.Oracle, sql, "", oql.PageSize, oql.PageNumber, 999);
                    break;

                case PWMIS.Common.DBMSType.MySql:
                    sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.MySql, sql, "", oql.PageSize, oql.PageNumber, 999);
                    break;

                case PWMIS.Common.DBMSType.PostgreSQL:
                    sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.PostgreSQL, sql, "", oql.PageSize, oql.PageNumber, 999);
                    break;

                default:
                    throw new Exception("实体类分页错误:不支持此种类型的数据库分页。");
                }
            }

            IDataReader reader = null;

            if (oql.Parameters != null && oql.Parameters.Count > 0)
            {
                int fieldCount         = oql.Parameters.Count;
                IDataParameter[] paras = EntityQueryAnonymous.GetParameters(oql.Parameters, db);
                //int index = 0;

                //foreach (string name in oql.Parameters.Keys)
                //{
                //    paras[index] = db.GetParameter(name, oql.Parameters[name]);
                //    index++;
                //}
                reader = db.ExecuteDataReader(sql, CommandType.Text, paras);
            }
            else
            {
                reader = db.ExecuteDataReader(sql);
            }
            return(reader);
        }
Ejemplo n.º 2
0
        private IDataReader ExecuteDataReader(OQL oql, AdoHelper db)
        {
            string sql = null;

            //处理实体类分页 2010.6.20
            if (oql.PageEnable)
            {
                //处理分页统前的记录数量统计问题 感谢网友 @成都-小兵 发现此问题
                if (oql.PageWithAllRecordCount == 0)
                {
                    //网友 if-else 发现以下问题,备注:
                    //这个函数在只有where而没有排序的时候,生成的统计语句的sql字符串的不对,会生成这种sql
                    //发现没有排序,且pagenumber为1的时候,就直接返回了这种select top这个字符串,自然就查不到count了
                    //其次就是有分页的时候,把字段名转大写了
                    //都在SQLpage.cs
                    object oValue = EntityQueryAnonymous.ExecuteOQLCount(oql, db);
                    oql.PageWithAllRecordCount = CommonUtil.ChangeType <int>(oValue);
                    if (oql.PageWithAllRecordCount == 0)
                    {
                        return(null);
                    }
                }

                #region  面代码已经重构

                /*
                 *
                 * switch (db.CurrentDBMSType)
                 * {
                 *  case PWMIS.Common.DBMSType.Access:
                 *  case PWMIS.Common.DBMSType.SqlServer:
                 *  case PWMIS.Common.DBMSType.SqlServerCe:
                 *      if (oql.haveJoinOpt)
                 *      {
                 *          if (oql.PageNumber <= 1) //仅限定记录条数
                 *          {
                 *              sql = "Select Top " + oql.PageSize + " " + sql.Trim().Substring("SELECT ".Length);
                 *
                 *          }
                 *          else //必须采用复杂分页方案
                 *          {
                 *              //edit at 2012.10.2 oql.PageWithAllRecordCount
                 *              sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.SqlServer, sql, "", oql.PageSize, oql.PageNumber, oql.PageWithAllRecordCount);
                 *
                 *          }
                 *      }
                 *      else
                 *      {
                 *          //单表查询的情况
                 *          if (oql.PageOrderDesc)
                 *              sql = PWMIS.Common.SQLPage.GetDescPageSQLbyPrimaryKey(oql.PageNumber, oql.PageSize, oql.sql_fields, oql.sql_table, oql.PageField, oql.sql_condition);
                 *          else
                 *              sql = PWMIS.Common.SQLPage.GetAscPageSQLbyPrimaryKey(oql.PageNumber, oql.PageSize, oql.sql_fields, oql.sql_table, oql.PageField, oql.sql_condition);
                 *      }
                 *
                 *      break;
                 *  case PWMIS.Common.DBMSType.Oracle:
                 *      sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.Oracle, sql, "", oql.PageSize, oql.PageNumber, 999);
                 *      break;
                 *  case PWMIS.Common.DBMSType.MySql:
                 *      sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.MySql, sql, "", oql.PageSize, oql.PageNumber, 999);
                 *      break;
                 *  case PWMIS.Common.DBMSType.PostgreSQL:
                 *      sql = PWMIS.Common.SQLPage.MakeSQLStringByPage(PWMIS.Common.DBMSType.PostgreSQL, sql, "", oql.PageSize, oql.PageNumber, 999);
                 *      break;
                 *  default:
                 *      throw new Exception("实体类分页错误:不支持此种类型的数据库分页。");
                 *
                 * }
                 */
                #endregion

                sql = EntityQueryAnonymous.GetOQLPageSql(oql, db);
                //分页SQL为空,可能分页页码超出可用范围,感谢 @深圳-有事Q我 发现此bug
                if (sql == string.Empty)
                {
                    return(null);
                }
            }
            else
            {
                sql = oql.ToString();
            }

            IDataReader reader = null;
            if (oql.Parameters != null && oql.Parameters.Count > 0)
            {
                int fieldCount         = oql.Parameters.Count;
                IDataParameter[] paras = EntityQueryAnonymous.GetParameters(oql.Parameters, db);
                //int index = 0;

                //foreach (string name in oql.Parameters.Keys)
                //{
                //    paras[index] = db.GetParameter(name, oql.Parameters[name]);
                //    index++;
                //}
                reader = db.ExecuteDataReader(sql, CommandType.Text, paras);
            }
            else
            {
                reader = db.ExecuteDataReader(sql);
            }
            return(reader);
        }