您的位置:首页 > 数据库

使用微软企业库,非分页sql语句得到分页数据方法

2007-07-20 11:46 337 查看
最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用datagrid绑定了.

以前长用的 DataAdapter.Fill(ds, StartRecordNo, PageSize, TableName); 这样获取某一页的数据.但是用微软企业库总么获得这样的数据按 .网上介绍 Database 类的 GetDataAdapter() 函数的文章太少了. 不过最终做成通用分页函数了.

用一条sql语句 select * from AAA 这样的语句,不是分页sql语句.得到总数目,总页数

现在定义的数据访问接口

public interface ISysMangerProvider
{
//执行sql语句获得DataSet数据
DataSet GetDataSetBySqlcomm(string Sqlcomm);

//执行sql语句获得DataSet数据 ,提供分页
DataSet GetDataSetBySqlcomm(int StartRecordNo, int PageSize, string Sqlcomm,string TableName);

//执行sql语句返回影响的行数目
int ExecSqlcomm(string Sqlcomm);

}

我门在微软企业库外面在包一层,放一些可以通用的函数 ,也可以简化数据提供者类的构造,和减少代码膨胀

#region 数据提供者,通用基础类
/// <summary>
/// 数据提供者,通用基础类
/// </summary>
public abstract class DataProviderBaseClass
{
#region 定义变量

protected Database db;
//protected object ReturnObjectValue;

#endregion

#region 构造函数

protected DataProviderBaseClass()
{

}

protected DataProviderBaseClass(int i): this()
{
db = DatabaseFactory.CreateDatabase();
}

protected DataProviderBaseClass(string connectionName): this()
{
db = DatabaseFactory.CreateDatabase(connectionName);
}

protected DataProviderBaseClass(SelectDataBae SDB):this()
{
db = DatabaseFactory.CreateDatabase(PublicNews.ChangeDataBase(SDB));
}

#endregion

#region 执行sql语句得到DataSet类型数据
/// <summary>
/// 执行sql语句得到DataSet类型数据
/// </summary>
/// <param name="Sqlcomm"></param>
/// <returns></returns>
protected DataSet ExecuteDataSetBySqlcomm(string Sqlcomm)
{
DataSet ds;
using (DbConnection dbConnection = this.db.CreateConnection())
{
ds = this.db.ExecuteDataSet(CommandType.Text, Sqlcomm);
dbConnection.Close();
}
return ds;
}
#endregion

#region 执行sql语句获得DataSet数据 ,提供分页
/// <summary>
/// 执行sql语句获得DataSet数据 ,提供分页
/// </summary>
/// <param name="PageNo">当前行数</param>
/// <param name="PageSize">一页分页数量</param>
/// <param name="Sqlcomm">sql语句</param>
/// <returns>DataSet对象</returns>
protected DataSet ExecuteDataSetBySqlcomm(int StartRecordNo, int PageSize, string Sqlcomm, string TableName)
{
DataSet ds = new DataSet();
using (DbConnection dbConnection = this.db.CreateConnection())
{
DbCommand dbCommand = this.db.GetSqlStringCommand(Sqlcomm + " ; select @@Rowcount ; ");
DbDataAdapter dbDataAdapter = this.db.GetDataAdapter();
dbCommand.Connection = dbConnection;
dbDataAdapter.SelectCommand = dbCommand;
dbConnection.Open();
dbDataAdapter.Fill(ds, StartRecordNo, PageSize, TableName);
dbConnection.Close();
}
return ds;
}
#endregion

#region 执行sql语句返回影响的行数目
/// <summary>
/// 执行sql语句返回影响的行数目
/// </summary>
/// <param name="stringcomm"></param>
/// <returns></returns>
protected int ExecIntBySqlcomm(string Sqlcomm)
{
using (DbConnection dbConnection = this.db.CreateConnection())
{
dbConnection.Open();
int i = this.db.ExecuteNonQuery(CommandType.Text, Sqlcomm);
dbConnection.Close();
return i;
}
}
#endregion

#region 检测DataSet对象是否有数据
/// <summary>
/// 检测DataSet对象是否有数据
/// </summary>
/// <param name="Ds">要检测的对象</param>
/// <returns>返回结果</returns>
public static bool CheckDataSet(DataSet Ds)
{
try
{
if (Ds != null && Ds.Tables.Count > 0 && Ds.Tables[0].Rows.Count > 0)
{
return true;
}
else
{
return false;
}
}
catch
{
throw;
}
}
#endregion

#region 检测DataSet对象是否有数据,分页支持
/// <summary>
/// 检测DataSet对象是否有数据,分页支持
/// </summary>
/// <param name="Ds">要检测的对象</param>
/// <returns>返回结果</returns>
public static bool CheckDataSetForPage(DataSet Ds, ref int ResultCount)
{
try
{
if (Ds != null && Ds.Tables.Count > 0 && Ds.Tables.Count == 2 && Ds.Tables[0].Rows.Count > 0)
{
ResultCount = Convert.ToInt32(Ds.Tables[1].Rows[0][0]);
if (ResultCount == 0)
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
catch
{
throw;
}
}
#endregion

}
#endregion

好了 最后数据提供者类就很简单了.

public class SysMangerProvider : DataProviderBaseClass ,ISysMangerProvider
{
#region 构造函数

public SysMangerProvider():base(1)
{

}

public SysMangerProvider(string connectionName):base(connectionName)
{

}

public SysMangerProvider(SelectDataBae SDB): base(SDB)
{

}

#endregion

#region 执行sql语句得到DataSet类型数据
/// <summary>
/// 执行sql语句得到DataSet类型数据
/// </summary>
/// <param name="Sqlcomm"></param>
/// <returns></returns>
public DataSet GetDataSetBySqlcomm(string Sqlcomm)
{
return base.ExecuteDataSetBySqlcomm(Sqlcomm);
}
#endregion

#region 执行sql语句获得DataSet数据 ,提供分页
/// <summary>
/// 执行sql语句获得DataSet数据 ,提供分页
/// </summary>
/// <param name="PageNo">当前行数</param>
/// <param name="PageSize">一页分页数量</param>
/// <param name="Sqlcomm">sql语句</param>
/// <returns>DataSet对象</returns>
public DataSet GetDataSetBySqlcomm(int StartRecordNo, int PageSize, string Sqlcomm,string TableName)
{
return base.ExecuteDataSetBySqlcomm(StartRecordNo, PageSize, Sqlcomm, TableName);
}
#endregion

#region 执行sql语句返回影响的行数目
/// <summary>
/// 执行sql语句返回影响的行数目
/// </summary>
/// <param name="stringcomm"></param>
/// <returns></returns>
public int ExecSqlcomm(string Sqlcomm)
{
return base.ExecIntBySqlcomm(Sqlcomm);
}
#endregion

}

在前台绑定的时候就非常简单了

int ResultCount = 0;
this.ds = this.SM.GetDataSetBySqlcomm(startIndex, this.DataGrid1.PageSize, " select * from PageInfo " ,"ShowList" );

if (DataProviderBaseClass.CheckDataSetForPage(this.ds, ref ResultCount))
{
this.DataGrid1.VirtualItemCount = ResultCount;
this.DataGrid1.DataSource = this.ds.Tables[0];
this.DataGrid1.DataBind();
}
else
{
this.Response.Write("对不起,没有获取到数据。");
}

好了 解决用微软企业库的sql语句分页问题.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐