C#执行的MySQL数据库分页通用操作
我的博客是用.net平台,用企业库完成对数据库的操作,能够连接MSSQL、ACCESS、ORACLE和SQLite都行,但是博客用不到 oracle,空间商没送MSSQL,所以我考虑ACCESS数据库,但是用的过程当中觉得ACCESS不太好用,但是现在是网站初期,数据库表经常变动,所以还是在用ACCESS,效率比较高。但是在网上查询了下,发现SQLite数据库比ACCESS还稳定,效果更高,就想改为用SQLite当数据库;
我的博客是用.net平台,用企业库完成对数据库的操作,能够连接MSSQL、ACCESS、ORACLE和SQLite都行,但是博客用不到oracle,空间商没送MSSQL,所以我考虑ACCESS数据库,但是用的过程当中觉得ACCESS不太好用,但是现在是网站初期,数据库表经常变动,所以还是在用ACCESS,效率比较高。但是在网上查询了下,发现SQLite数据库比ACCESS还稳定,效果更高,就想改为用SQLite当数据库;
查询下发现企业库能连接SQLite数据库,并提供操作支持,想改这数据库研究研究下,但是这数据库没空间供应商提供的MySQL好,但是企业库又不支持MySQL数据库的连接操作,很纠结,就在数据库层加了对MySQL操作的方法,利用MySql.Data.dll提供的方法,就同微软的PetShop提供的SQlHelper;相当好用,也相当强大,写好了数据层和业务层,但是发现项目中用了好多的分页方法;MSSQL和ACCESS方法都有,就MySQL比较少,而且之前的方法都要返回记录总数,在网上查找下都是千遍一律的一般分页方法,不是自己想要的;
但是发现MySQL提供一 SQL_CALC_FOUND_ROWS sql语句,查看手册后发现此关键词的作用是在查询时统计满足过滤条件后的结果的总数(不受 Limit 的限制),而且FOUND_ROWS() 则取到了这个纪录;
比如:想查找goods表中k字段为avs的前十条记录,并返回满足这条件的总行数;
SELECT SQL_CALC_FOUND_ROWS goods WHERE k='avs' LIMIT 10;
SELECT FOUND_ROWS();
所以根据上面这条件,我就写了个分页的通用方法;
/// <summary>
/// MySQL分页
/// </summary>
/// <param name="TbName">表名</param>
/// <param name="StrWhere">条件</param>
/// <param name="OrderBy">排序语句</param>
/// <param name="FieldList">查询字段</param>
/// <param name="CurrentNum">当前页</param>
/// <param name="PageNum">每页记录数</param>
/// <param name="AllCount">返回总记录数</param>
/// <returns></returns>
public static DataTable GetCommPaddMySQL(string TbName, string StrWhere, string OrderBy, string FieldList, int CurrentNum, int PageNum, ref int AllCount)
{
DataTable dt_MySQL=new DataTable();
if (CurrentNum<1)
{
CurrentNum = 1;
}
Int64 startPageNum = (CurrentNum - 1) * PageNum;
StringBuilder sql = new StringBuilder();
sql.Append("SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS ");
sql.Append(FieldList " FROM " TbName " WHERE " StrWhere);
sql.Append(" " OrderBy " limit " startPageNum.ToString());
sql.Append("," PageNum.ToString());
sql.Append(" ;SELECT FOUND_ROWS(); ");
DataSet ds = MySql.Data.MySqlClient.MySqlHelper.ExecuteDataset(sql.ToString());
dt_MySQL = ds.Tables[0];
if (!string.IsNullOrEmpty(ds.Tables[1].Rows[0][0].ToString()))
AllCount = Convert.ToInt32(ds.Tables[1].Rows[0][0].ToString());
else
AllCount = 0;
return dt_MySQL;
}