您的位置:首页 > 数据库

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 适易查询分析、工作流、内容管理及项目管理演示平台
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: