君子意如何

我就是路人甲 http://www.dongdongyou.com/ 动动友

导航

使用微软企业库,非分页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语句分页问题.

posted on 2007-07-20 11:46  君子意如何  阅读(1054)  评论(0编辑  收藏  举报