C#将SQL语句转换为分页SQL和获取记录数SQL
2011-10-25 08:45
651 查看
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 适易查询分析、工作流、内容管理及项目管理演示平台
/// <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 适易查询分析、工作流、内容管理及项目管理演示平台
相关文章推荐
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- c# Adapter 获取sql语句
- C#中获取的SQL日期精度丢失毫秒的处理--SQL日期格式转换
- SQL分页语句,.NET中获取字符串的MD5码
- 从数据库表中随机获取N条记录的SQL语句
- 分页语句-取出sql表中第31到40的记录(以自动增长ID为主键)
- C#获取SQL 2005表中的记录总数!...
- SQL_server 将表中的记录 转换成 Insert(插入) SQL 语句
- JDBC获取SQL查询语句返回记录数的三种方式效率比较
- 利用标准SQL语句实现查询记录分页
- 利用标准的SQL语句实现查询记录分页
- C#获取SQL 2005表中的记录总数!...
- SQL 分页查询语句大全即(查找第N到M条记录的方法)
- 从数据库表中随机获取N条记录的SQL语句
- 巧用C# Split()函数获取SQL语句中操作字段
- 用标准的SQL语句实现查询记录分页
- 写sql语句 获取数据库中A表的第31条-40条的记录
- 使用SQL语句获取数据库中随机N个记录
- 使用SQL语句获取数据库中随机N个记录
- Sharepoint 2010 获取一个列表的所有字段,并转换成SQL语句