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

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值