C#分页通用类,基于类型化DataSet支持

    技术2022-05-11  67

    该类实现了分页条件组合,但只有一个完整传参的方法,实际中可自己重载

    该类与数据访问相关,可与分页组件合用(这两个类见其它文章)

    相关存储过程附在下边

    using System;using System.Data;using System.Collections;using HKH.DataBase;using HKH.DataBase.Type;

    namespace HKH.Common{ /// <summary> /// 分页取得数据 /// </summary> public class clsPagination {  IDbDataAdapter adapter = null;  IDbCommand cmd = null;  public clsPagination()  {   adapter = DBFactory.GetDAOBuilder().GetQueryDataAdapter();   cmd = adapter.SelectCommand;  }

      #region 整理后的方法  By Lwt 2006-03-30

      #region 组织查询条件

      /// <summary>  /// 组织查询条件  /// </summary>  /// <param name="myds">可包含多表的DataSet</param>  /// <param name="Key">搜索关键字</param>  /// <returns></returns>  public string GetCondition(string Key,DataSet myds)  {   return GetCondition(myds,Key,0);  }

      /// <summary>  /// 组织查询条件  /// </summary>  /// <param name="myds">可包含多表的DataSet</param>  /// <param name="Key">搜索关键字</param>  /// <param name="UserID">读者域单独搜索</param>  /// <returns></returns>  public string GetCondition(DataSet myds,string Key,int UserID)  {   string condition="";   string tempcondition="";   for(int i=0;i<myds.Tables.Count;i++)   {    string currTableName="";//当前表名,或别名    //SQL串超长时,可用别名    if(myds.Tables[i].ExtendedProperties.Count>0 && myds.Tables[i].ExtendedProperties.ContainsKey("Alias") && myds.Tables[i].ExtendedProperties["Alias"].ToString().Trim() != "")    {     currTableName = myds.Tables[i].ExtendedProperties["Alias"].ToString().Trim();    }    else    {     currTableName = myds.Tables[i].TableName;    }

        for(int j=0;j<myds.Tables[i].Columns.Count;j++)    {     if(myds.Tables[i].Columns[j].ExtendedProperties.Count>0 && myds.Tables[i].Columns[j].ExtendedProperties.ContainsKey("Query") && myds.Tables[i].Columns[j].ExtendedProperties["Query"].ToString()=="1")     {      if(myds.Tables[i].Columns[j].DataType==System.Type.GetType("System.DateTime"))      {       if(clsCheckValid.CheckDate(Key))       {        condition=condition+currTableName+"."+myds.Tables[i].Columns[j].ColumnName+" = '"+Key+"' or ";       }      }      else      {       condition=condition+currTableName+"."+myds.Tables[i].Columns[j].ColumnName+" like '%"+Key+"%' or ";      }     }    }   }

       if( "" == condition )   {    condition = "(1=1)";//默认显示所有   }   else   {    condition += " (1=0)";   }

       if( "" != tempcondition )   {    condition="("+tempcondition+") and ("+condition+")";   }   return condition;  }

      #endregion

      #region 通用分页方法

      /// <summary>  /// 通用分页方法  /// </summary>  /// <param name="myds">组织条件使用的DataSet</param>  /// <param name="DisplayColumns">字段显示列表</param>  /// <param name="SearchKey">搜索关键字</param>  /// <param name="SortColumn">排序列</param>  /// <param name="joinColumn">外联接的列</param>  /// <param name="joinTable">外联接的表</param>  /// <param name="UserID">用户ID</param>  /// <param name="Condition">用户自定义条件</param>  /// <param name="pageSize">每页行数</param>  /// <param name="linkNumber">当前页索引</param>  /// <param name="TotalAmount">总行数</param>  /// <returns></returns>  public DataSet GetPageData(DataSet myds,ArrayList DisplayColumns,string SearchKey,string SortColumn,string joinColumn,string joinTable,int UserID,string Condition,int pageSize,int linkNumber,ref int TotalAmount)  {   //清除本用户的临时表   ClearTempTab(UserID);

       string currTableName="";//主表名或别名

       if(myds.Tables[0].ExtendedProperties.Count>0 && myds.Tables[0].ExtendedProperties.ContainsKey("Alias") && myds.Tables[0].ExtendedProperties["Alias"].ToString().Trim() != "")   {    currTableName = myds.Tables[0].ExtendedProperties["Alias"].ToString().Trim();   }   else   {    currTableName = myds.Tables[0].TableName;   }

       string mycondition=GetCondition(myds,SearchKey,UserID);

       if(Condition !=null && Condition.Trim() !="")   {    mycondition ="(" + mycondition + ") and ("+Condition+")";   }

       int startRow=pageSize*(linkNumber-1);   int endRow=pageSize*linkNumber-1;

       DataColumn[] PrimaryKeys=myds.Tables[0].PrimaryKey;      string strColumns="";   if(DisplayColumns !=null && DisplayColumns.Count>0)   {    for(int i=0;i<DisplayColumns.Count;i++)    {     if(DisplayColumns[i].ToString().Trim()!="")     {      strColumns+=","+currTableName+"."+DisplayColumns[i].ToString().Trim();     }    }   }   else   {    strColumns+=","+currTableName+".*";   }

       string strCreate="select Distinct("+currTableName+"."+PrimaryKeys[0].ColumnName+") as OnlyOne"+strColumns+joinColumn+" into ##TempTab" + UserID.ToString() + " from "+myds.Tables[0].TableName;      //是否有别名   if (myds.Tables[0].TableName.CompareTo(currTableName) != 0)   {    strCreate+=" as " + currTableName;   }      strCreate+=joinTable+" where "+mycondition;

       if(SortColumn!=null && SortColumn.Trim()!="")   {    strCreate+=" order by "+SortColumn+";";   }   else   {    strCreate+=";";   }

       string strDrop="drop table ##TempTab" + UserID.ToString() + ";";   string strSQL="";

       //------构造表的别名   ArrayList tables=new ArrayList();   for(int i=0;i<PrimaryKeys.Length+2;i++)   {    tables.Add("T"+i.ToString());   }   strSQL="select * from (select top 100 percent";   //----构造序列号   ArrayList sqls=new ArrayList();   for(int i=0;i<PrimaryKeys.Length;i++)   {    #region 拼凑生成序列的条件

        int temp=i;    string strcondition="";

        while(temp!=0)    {     temp=temp-1;     strcondition=strcondition+tables[i]+"."+PrimaryKeys[temp].ColumnName+"="+tables[tables.Count-2]+"."+PrimaryKeys[temp].ColumnName+" and ";    }

        strcondition=strcondition+tables[i]+"."+PrimaryKeys[i].ColumnName+"<"+tables[tables.Count-2]+"."+PrimaryKeys[i].ColumnName+" and ";

        strcondition=strcondition+"(1=1)";

        #endregion

        if(i==PrimaryKeys.Length-1)    {     sqls.Add("(select count(*) from ##TempTab" + UserID.ToString() +" as "+tables[i]+" where "+strcondition+")");    }    else    {     sqls.Add("(select count(*) from ##TempTab" + UserID.ToString() + " as "+tables[i]+" where "+strcondition+")+");    }       }   for(int i=0;i<sqls.Count;i++)   {    strSQL=strSQL+sqls[i];   }

       strSQL=strSQL+" as RowIndex,* from ##TempTab" + UserID.ToString() + " as "+tables[tables.Count-2]+" order by RowIndex)"+" as "+    tables[tables.Count-1]+" where "+tables[tables.Count-1]+"."+"RowIndex between "+startRow.ToString()+" and "+endRow.ToString();

       strSQL+="select count(*) from ##TempTab" + UserID.ToString() + ";";

       DataSet ds=new DataSet();

       ProcParameter[] parameters = new ProcParameter[4];   parameters[0] = new ProcParameter("@SQLString",strSQL,ProcParameterType.NVarChar,4000);   parameters[1] = new ProcParameter("@SubSQLString",strCreate+"~"+strDrop,ProcParameterType.NVarChar,4000);   parameters[2] = new ProcParameter("@PageNum",linkNumber,ProcParameterType.Int,4);   parameters[3] = new ProcParameter("@ShowCount",pageSize,ProcParameterType.Int,4);

       IDbCommand procCmd = DBFactory.GetDAOBuilder().GetSprocCommand("SP_ExecSQL_2",parameters);

       adapter.SelectCommand = procCmd;

       adapter.Fill(ds);

       TotalAmount=ds.Tables[1].Rows.Count>0 ? (Convert.IsDBNull(ds.Tables[1].Rows[0][0]) ? 0 : Convert.ToInt32(ds.Tables[1].Rows[0][0])) : 0;

       ds.Tables[0].Columns.Remove("RowIndex");   ds.Tables[0].Columns.Remove("OnlyOne");

       return ds;  }   #endregion

      #region 报表查询方法(主要完成分页功能)

      /// <summary>  /// 报表分页  /// </summary>  /// <param name="reportSql">报表数据查询的SQL语句</param>  /// <param name="DisplayColumns">要显示的列</param>  /// <param name="UserID">当前用户名</param>  /// <param name="pageSize">每页行数</param>  /// <param name="linkNumber">当前页索引</param>  /// <param name="TotalAmount">总行数</param>  /// <returns></returns>  public DataSet GetDataForReport(string reportSql,ArrayList DisplayColumns,int UserID,int pageSize,int linkNumber,ref int TotalAmount)  {   //清除本用户的临时表   ClearTempTab(UserID);

       int startRow=pageSize*(linkNumber-1);   int endRow=pageSize*linkNumber-1;

       //--------限定搜索范围   string strCreate="create table ##TempTab" + UserID.ToString() + "(pid int IDENTITY PRIMARY KEY";   for(int i=0;i<DisplayColumns.Count;i++)   {    strCreate+=","+DisplayColumns[i];   }   strCreate+=");insert into ##TempTab" + UserID.ToString() + "(";   for(int i=0;i<DisplayColumns.Count;i++)   {    string keyi=DisplayColumns[i].ToString();    strCreate+=keyi.Substring(0,keyi.IndexOf(" "))+",";   }   strCreate=strCreate.Substring(0,strCreate.Length-1);   strCreate+=")"+reportSql;   string strDrop="drop table ##TempTab" + UserID.ToString();   string strRange="##TempTab" + UserID.ToString();   //------构造表的别名   ArrayList tables=new ArrayList();   for(int i=0;i<3;i++)   {    tables.Add("T"+i.ToString());   }   string strSQL="select * from (select top 100 percent";   //----构造序列号   ArrayList sqls=new ArrayList();   #region 拼凑生成序列的条件

       string strcondition="";   strcondition=strcondition+tables[0]+".pid <"+tables[1]+".pid and ";   strcondition=strcondition+"(1=1)";   sqls.Add("(select count(*) from "+strRange+" as "+tables[0]+" where "+strcondition+")");

       #endregion    for(int i=0;i<sqls.Count;i++)   {    strSQL=strSQL+sqls[i];   }

       strSQL=strSQL+" as RowIndex,* from "+strRange + " as "+tables[tables.Count-2]+" order by RowIndex)"+" as "+    tables[tables.Count-1]+" where "+tables[tables.Count-1]+"."+"RowIndex between "+startRow.ToString()+" and "+endRow.ToString()+";";

       strSQL+="select count(*) from ##TempTab" + UserID.ToString() + ";";

       DataSet ds=new DataSet();

       cmd.CommandText=strCreate+" "+strSQL+" "+strDrop;

       adapter.Fill(ds);

       TotalAmount=ds.Tables[1].Rows.Count>0 ? (Convert.IsDBNull(ds.Tables[1].Rows[0][0]) ? 0 : Convert.ToInt32(ds.Tables[1].Rows[0][0])) : 0;

       ds.Tables[0].Columns.Remove("RowIndex");

       return ds;  }

      #endregion

      #region 清除临时表,因一旦执行过程中出现异常,临时表驻于TEMPDB数据库

      private void ClearTempTab(int UserID)  {   try   {    ProcParameter[] parameters = new ProcParameter[1];    parameters[0] = new ProcParameter("@TempTabName","##TempTab" + UserID.ToString() + ";",ProcParameterType.VarChar,200);

        IDbCommand procCmd = DBFactory.GetDAOBuilder().GetSprocCommand("clearTempTab",parameters);

        procCmd.Connection.Open();    procCmd.ExecuteNonQuery();    procCmd.Connection.Close();    procCmd.Dispose();   }   catch(Exception ex)   {    throw ex;   }  }

      #endregion

      #endregion }} 


    最新回复(0)