最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用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 数据提供者,通用基础类
///
/// 数据提供者,通用基础类
///
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类型数据
///
/// 执行sql语句得到DataSet类型数据
///
///
///
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数据 ,提供分页
///
/// 执行sql语句获得DataSet数据 ,提供分页
///
/// 当前行数
/// 一页分页数量
/// sql语句
/// DataSet对象
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语句返回影响的行数目
///
/// 执行sql语句返回影响的行数目
///
///
///
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对象是否有数据
///
/// 检测DataSet对象是否有数据
///
/// 要检测的对象
/// 返回结果
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对象是否有数据,分页支持
///
/// 检测DataSet对象是否有数据,分页支持
///
/// 要检测的对象
/// 返回结果
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类型数据
///
/// 执行sql语句得到DataSet类型数据
///
///
///
public DataSet GetDataSetBySqlcomm( string Sqlcomm)
{
return base .ExecuteDataSetBySqlcomm(Sqlcomm);
}
#endregion
#region 执行sql语句获得DataSet数据 ,提供分页
///
/// 执行sql语句获得DataSet数据 ,提供分页
///
/// 当前行数
/// 一页分页数量
/// sql语句
/// DataSet对象
public DataSet GetDataSetBySqlcomm( int StartRecordNo, int PageSize, string Sqlcomm, string TableName)
{
return base .ExecuteDataSetBySqlcomm(StartRecordNo, PageSize, Sqlcomm, TableName);
}
#endregion
#region 执行sql语句返回影响的行数目
///
/// 执行sql语句返回影响的行数目
///
///
///
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语句分页问题.