C#将SQL语句转换为分页SQL和获取记录数SQL

C#将SQL语句转换为分页SQL和获取记录数SQL

/// <summary>
/// 将语句转化为分页SQL语句,两条包含分页的获取数据SQL;获取记录数SQL 贾世义
/// </summary>
/// <param name="dbtype">支持数据类型(Sql2005、Oracle、Db2、Infomix)</param>
/// <param name="sql">SQL语句(Sql2005、Oracle、Db2必须包含order by,正常的一条SQL语句)</param>
/// <param name="pageIndex">开始(从0开始)</param>
/// <param name="pageSize">分页大小</param>
/// <returns>两条语句,包含分页的获取数据SQL;获取记录数SQL</returns>
public static string GetPageSql(DBType dbtype, string sql, int pageIndex, int pageSize)
{
if (String.IsNullOrEmpty(sql))
{
return null;
}
//不支持分页SQL
if (dbtype == DBType.Sql2000 || dbtype == DBType.OleDb || dbtype == DBType.Odbc)
{
return sql;
}
string start = "0";
if (pageIndex > 0)
{
start = Convert.ToString(pageIndex * pageSize);
}
int select = GetStartWith(sql, "select");
if (dbtype == DBType.OdbcInformix)
{
return "select skip " + start + " first " + pageSize.ToString()
+ " " + sql.Substring(select);
}
//拆分SQL
string end = Convert.ToString((pageIndex + 1) * pageSize);
string fromSql = GetFromSql(sql, "from");
//select部分 含select
string selectSql = "select " + sql.Substring(select, sql.Length - select - fromSql.Length);
string orderSql = GetFromSql(sql, "order by");
if (!String.IsNullOrEmpty(orderSql))
{
//将from后的order by去除
fromSql = fromSql.Substring(0, fromSql.Length - orderSql.Length);
}
else
{
throw new Exception(dbtype + "使用分页必须包含order by");
}
//合并成分页SQL
string strSql = "select * from (" + selectSql;
//order部分 含 order by
string rownum;
if (dbtype == DBType.OdbcDb2)
{
rownum = "rownumber()";
}
else
{
rownum = "row_number()";
}
strSql += "," + rownum + " over (" + orderSql + ") as rn " + fromSql
+ ") as data where rn>" + start + " and rn<=" + end;
if (!String.IsNullOrEmpty(GetFromSql(fromSql, "group by")))
{
fromSql = " from (select count(*) as amount " + fromSql + ") tbl";
}
return strSql + ";select count(*) as [" + Constants.MYQUERY_AMOUNT + "] " + fromSql;
}

欢迎访问:http://121.18.78.216 适易查询分析、工作流、内容管理及项目管理演示平台

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值