该类实现了分页条件组合,但只有一个完整传参的方法,实际中可自己重载
该类与数据访问相关,可与分页组件合用(这两个类见其它文章)
相关存储过程附在下边
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
}
}