

/**/
/// <summary>

/// MS sqlSERVER 分页sql语句生成器,同样适用于ACCESS数据库(edit:2008.3.29)

/// </summary>

/// <param name="strsqlInfo">原始sql语句</param>

/// <param name="strWhere">在分页前要替换的字符串,用于分页前的筛选</param>

/// <param name="PageSize">页大小</param>

/// <param name="PageNumber">页码</param>

/// <param name="AllCount">记录总数</param>

/// <returns>生成sql分页语句</returns>

private
static
string
MakePagesqlStringByMSsql(
string
strsqlInfo,
string
strWhere,
int
PageSize,
int
PageNumber,
int
AllCount)


...
{


分页位置分析#region 分页位置分析

string strsqlType=string.Empty ;

if(AllCount!=0)


...{

if(PageNumber==1) //首页


...{

strsqlType="First";

}

else if(PageSize*PageNumber>AllCount) //最后的页 @@LeftSize


...{

PageSize=AllCount-PageSize*(PageNumber-1);

strsqlType="Last";

}

else //中间页


...{

strsqlType="Mid";

}

}

else if(AllCount<0) //特殊处理 dth,2006.10.19


...{

strsqlType="First";

}

else


...{

strsqlType="Count";

}


#endregion



sql 复杂度分析#region sql 复杂度分析

//sql 复杂度分析 开始

bool sqlFlag=true;//简单sql标记

string Testsql=strsqlInfo.toupper ();

int n=Testsql.IndexOf ("SELECT ",0);

n=Testsql.IndexOf ("SELECT ",n+7);

if(n==-1)


...{

//可能是简单的查询,再次处理

n=Testsql.IndexOf (" JOIN ",n+7);

if(n!=-1) sqlFlag=false;

else


...{

//判断From 谓词情况

n=Testsql.IndexOf("FROM ",9);

if(n==-1) return "";

//计算 WHERE 谓词的位置

int m=Testsql.IndexOf ("WHERE ",n+5);

// 如果没有WHERE 谓词

if(m==-1) m=Testsql.IndexOf ("ORDER BY ",n+5);

//如果没有ORDER BY 谓词,那么无法排序,退出;

if(m==-1)

throw new Exception ("查询语句分析:当前没有为分页查询指定排序字段!请适当修改sql语句。 "+strsqlInfo);

string strTableName=Testsql.Substring (n,m-n);

//表名中有 , 号表示是多表查询

if(strTableName.IndexOf (",")!=-1)

sqlFlag=false;

}

}

else


...{

//有子查询;

sqlFlag=false;

}

//sql 复杂度分析 结束

#endregion



排序语法分析#region 排序语法分析

//排序语法分析 开始

int iOrderAt=strsqlInfo.ToLower ().LastIndexOf ("order by ");

//如果没有ORDER BY 谓词,那么无法排序分页,退出;

if(iOrderAt==-1)

throw new Exception ("查询语句分析:当前没有为分页查询指定排序字段!请适当修改sql语句。 "+strsqlInfo);


string strOrder=strsqlInfo.Substring (iOrderAt+9);

strsqlInfo=strsqlInfo.Substring(0,iOrderAt);


string[] strArrOrder=strOrder.Split (new char []...{','});

for(int i=0;i<strArrOrder.Length ;i++)


...{


string[] strArrTemp=(strArrOrder[i].Trim ()+" ").Split (new char[]...{' '});

//压缩多余空格

for(int j=1;j<strArrTemp.Length ;j++)


...{

if(strArrTemp[j].Trim ()=="")


...{

continue;

}

else


...{

strArrTemp[1]=strArrTemp[j];

if(j >1 ) strArrTemp[j]="";

break;

}

}

//判断字段的排序类型

switch(strArrTemp[1].Trim ().toupper ())


...{

case "DESC":

strArrTemp[1]="ASC";

break;

case "ASC":

strArrTemp[1]="DESC";

break;

default:

//未指定排序类型,默认为降序

strArrTemp[1]="DESC";

break;

}

//消除排序字段对象限定符

if(strArrTemp[0].IndexOf (".")!=-1)

strArrTemp[0]=strArrTemp[0].Substring (strArrTemp[0].IndexOf (".")+1);

strArrOrder[i]=string.Join (" ",strArrTemp);


}

//生成反向排序语句

string strNewOrder=string.Join (",",strArrOrder).Trim ();

strOrder=strNewOrder.Replace ("ASC","ASC0").Replace ("DESC","ASC").Replace ("ASC0","DESC");

//排序语法分析结束

#endregion



构造分页查询#region 构造分页查询

string sql=string.Empty ;

if(!sqlFlag)


...{

//复杂查询处理

switch(strsqlType.toupper ())


...{

case "FirsT":

sql="Select Top @@PageSize * FROM ( " +strsqlInfo+

" ) P_T0 @@Where ORDER BY "+strOrder;

break;

case "MID":

sql=@"SELECT Top @@PageSize * FROM

(SELECT Top @@PageSize * FROM

(

SELECT Top @@Page_Size_Number * FROM (";

sql+=" "+strsqlInfo+" ) P_T0 @@Where ORDER BY "+strOrder+" ";

sql+=@") P_T1

ORDER BY "+ strNewOrder +") P_T2 "+

"ORDER BY "+strOrder;

break;

case "LAST":

sql=@"SELECT * FROM (

Select Top @@LeftSize * FROM ("+" "+strsqlInfo+" ";

sql+=" ) P_T0 @@Where ORDER BY "+ strNewOrder+" "+

" ) P_T1 ORDER BY "+strOrder;

break;

case "COUNT":

sql="Select COUNT(*) FROM ( " +strsqlInfo+" ) P_Count @@Where";

break;

default:

sql=strsqlInfo+strOrder;//还原

break;

}


}

else


...{

//简单查询处理

switch(strsqlType.toupper ())


...{

case "FirsT":

sql=strsqlInfo.toupper().Replace ("SELECT ","SELECT TOP @@PageSize ");

sql+=" @@Where ORDER BY "+strOrder;

break;

case "MID":

string strRep=@"SELECT Top @@PageSize * FROM

(SELECT Top @@PageSize * FROM

(

SELECT Top @@Page_Size_Number ";

sql=strsqlInfo.toupper().Replace ("SELECT ",strRep);

sql+=" @@Where ORDER BY "+strOrder;

sql+=" ) P_T0 ORDER BY "+ strNewOrder+" "+

" ) P_T1 ORDER BY "+strOrder;

break;

case "LAST":

string strRep2=@"SELECT * FROM (

Select Top @@LeftSize ";

sql=strsqlInfo.toupper().Replace ("SELECT ",strRep2);

sql+=" @@Where ORDER BY "+ strNewOrder+" "+

" ) P_T1 ORDER BY "+strOrder;

break;

case "COUNT":

sql="Select COUNT(*) FROM ( " +strsqlInfo+" @@Where) P_Count ";//edit 2008.3.29

break;

default:

sql=strsqlInfo+strOrder;//还原

break;

}

}


//执行分页参数替换

sql=sql.Replace ("@@PageSize",PageSize.ToString ())

.Replace ("@@Page_Size_Number",Convert.ToString (PageSize * PageNumber))

.Replace ("@@LeftSize",PageSize.ToString ());//

//.Replace ("@@Where",strWhere);

//针对用户的额外条件处理:

if(strWhere!="" && strWhere.toupper ().Trim ().StartsWith ("WHERE "))


...{

throw new Exception ("分页额外查询条件不能带Where谓词!");

}

if(!sqlFlag)


...{

if(strWhere!="") strWhere=" Where "+strWhere;

sql=sql.Replace ("@@Where",strWhere);

}

else


...{

if(strWhere!="") strWhere=" And ("+strWhere+")";

sql=sql.Replace ("@@Where",strWhere);

}

return sql;

#endregion

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。