最近使用微软企业库,在做分页绑定的时候发现好象还没有多少通用的方法.为了灵活和换数据库,我不能使用存储过程.为了开发速度最快.我就是用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语句分页问题.