拼吾爱程序人生.Net编程ADO.Net ADO.NET 数据库访问之数据分页

1  /  1  页   1 跳转 查看:1048

ADO.NET 数据库访问之数据分页

ADO.NET 数据库访问之数据分页

文/佚名  出处/中国IT实验室

    程序尽可能地降低其使用的复杂性,它的优点是使用方便。现在这个程序还有一个缺点,那就是第读取一页的数据,都要打开一次数据库,这个问题是可以解决的,那就是要求在不使用之用执行一个Close,关闭数据库,这是以牺牲程序的安全性为代价的。各个方面需要权衡利弊。



引用:
    * 使用说明:
    * 首先创建一个MyDataPage类实例mypage,然后设置数据库连接串、查询表、查询列、查询条件、
    * 排序条件等。然后执行mypage.DoPaging(),注意检查其返回值,返回真表示分页成功,否则
    * 应查看mypage.ErrMessage属性。成功后,就可以使用mypage.GetData(<页编号>)读取数据了.
    *
    * 示例:
    *
    * using MyLibrary.DataAccess;
    * MyDataPage myPage = new MyDataPage(
    *  "provider=sqloledb;server=(local);uid=sa;pwd=oohacker;database=Northwind",
    *  "Product",
    *  "ProductId,ProductName",
    *  "SupplierId<>1",
    *  "SupplierId ASC, ProductId DESC",
    *  20);
    *
    * if (myPage.DoPaging())
    * {
    *  Console.Write("Total Records: {0}  Total Pages: {1} ",
    *    myPage.RecordCount,
    *    myPage.PageCount);
    *
    *  for (int i=1; i<=myPage.PageCount; ++i)
    *  {
    *    Console.Write("Page {0} ", i);
    *    DataTable table = myPage.GetData(i);
    *    for (int j=0; j<table.Rows.Count; ++j)
    *    {
    *      Console.Write("#{0}:{1} ",
    *        table.Rows[j]["ProductId"],
    *        table.Rows[j]["ProductName"]);
    *    }
    *  }
    * }
    * else
    * {
    *  Console.Write("分页失败!原因:{0} ",  myPage.ErrMessage);
    * }
    *


    using System;
    using System.Text;
    using System.Data;
    using System.Data.OleDb;
    using System.Collections;

    namespace MyLibrary.DataAccess
    ...{
      public class MyDataPage
      ...{
    成员变量#region 成员变量
    const int defaltPageSize = 10;
    private int recordCount;
    private int pageCount;
    private int pageSize;
    private string table;
    private string columns;
    private string conditions;
    private string orders;
    private string connectionString;
    private string errorMessage;
    private bool isDirty;
    #endregion

    构造函数

Code




 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [ADO.Net] 的这些文章也感兴趣:

ADO.NET入门(4)
用VisualC#来增加数据记录
ADO.NET Entity Framework:lazy loading(二)
用VisualC#来修改和删除数据库记录
在ADO.NET数据集中浏览多个相关表(6)
ADO.NET Entity Framework:关于重复访问数据库的探讨
在C#中使用COM 实现事务控制
ADO.NET Entity Framework 体验:概念模型
ADO.NET Entity Framework 体验:语言
Using ADO.NET Data Service - 服务端
 

回复:ADO.NET 数据库访问之数据分页



引用:
// 获取和设置要读取的列
    public string Columns
    ...{
      set
      ...{
        this.columns = value.Trim();
        if (this.columns == "") this.columns = "*";
        isDirty = true;
      }
      get ...{ return this.columns; }
    }

    // 获取和设置读取的条件
    public string Conditions
    ...{
      set ...{ this.conditions = value.Trim(); isDirty = true; }
      get ...{ return this.conditions; }
    }

    // 获取或设置排序
    public string Orders
    ...{
      set ...{ this.orders = value.Trim(); isDirty = true; }
      get ...{ return this.orders; }
    }

    // 获取设置连接字串
    public string ConnectionString
    ...{
      set ...{ this.connectionString = value; isDirty = true; }
      get ...{ return this.connectionString; }
    }

    // 获取SQL查询命令
    public string SelectCommand
    ...{
      get
      ...{
        StringBuilder command = new StringBuilder(256);
        command.AppendFormat("select {0} from [{1}] ", columns, table);
        if (conditions != "")
        ...{
          command.AppendFormat(" where {0}", conditions);
        }
        if (orders != "")
        ...{
          command.AppendFormat(" order by {0}", orders);
        }
       
        return command.ToString();
      }
    }

    // 获取异常信息
    public string ErrMessage
    ...{
      get ...{ return errorMessage; }
    }

    // 执行分页
    public bool DoPaging()
    ...{
      errorMessage = "";
      // 生成统计SQL
      StringBuilder sqlParas = new StringBuilder(256);
      sqlParas.AppendFormat("from [{0}] ", table);
      if (conditions != "")
      ...{
        sqlParas.AppendFormat(" where {0}", conditions);
      }
      String sqlCount = "select count(*) as [RowCount] " + sqlParas.ToString();

      // 开始统计
      OleDbConnection conn = new OleDbConnection(connectionString);
      try
      ...{
        conn.Open();
      }
      catch (Exception e)
      ...{
        errorMessage = e.Message;
        return false;
      }
 

回复:ADO.NET 数据库访问之数据分页



引用:
// 执行分页获取记录数和页面数信息
      OleDbDataAdapter adapter = new OleDbDataAdapter();
      DataSet ds = new DataSet();
      try
      ...{
        // 统计总记录数, 得出记录总和页面数
        adapter.SelectCommand = new OleDbCommand(sqlCount, conn);
        adapter.Fill(ds, "Count");
        recordCount = (int)(ds.Tables["count"].Rows[0])["RowCount"];
        ds.Clear();

        pageCount = recordCount / pageSize + (recordCount % pageSize > 0 ? 1 : 0);
      }
      catch (Exception e)
      ...{
        errorMessage = e.Message;
        return false;
      }
      finally
      ...{
        conn.Close();
      }

      isDirty = false;
     
      return true;
    }

    // 执行分页查询
    public DataTable GetData(int page)
    ...{
      errorMessage = "";
      if (isDirty)
      ...{
        errorMessage = "查询条件已改变,必须先执行分页才能再次读取数据";
        return null;
      }

      // 开始查询
      OleDbConnection conn = new OleDbConnection(connectionString);
      try
      ...{
        conn.Open();
      }
      catch (Exception e)
      ...{
        errorMessage = e.Message;
        return null;
      }

      // 执行分页并读取数据
      OleDbDataAdapter adapter = new OleDbDataAdapter();
      DataSet ds = new DataSet();
      try
      ...{
        // 执行分页并读取数据
        if (page > pageCount)
        ...{
          errorMessage = "页面数溢出!";
          return null;
        }
        int recordStartIndex = (page - 1) * pageSize;
        adapter.SelectCommand = new OleDbCommand(this.SelectCommand, conn);
        adapter.Fill(ds, recordStartIndex, pageSize, table);
      }
      catch (Exception e)
      ...{
        errorMessage = e.Message;
        return null;
      }
      finally
      ...{
        conn.Close();
      }
      return ds.Tables[table];
      }
      }
    }
 
1  /  1  页   1 跳转

快速回复帖子

标题
禁用 URL 识别
禁用表情
禁用 Discuz!NT 代码
使用个人签名
  [完成后可按 Ctrl+Enter 无刷新发布]  

版权所有 拼吾爱程序人生 

Powered by Discuz!NT 2.1.202   Copyright © 2001-2008 Comsenz Inc. 鄂ICP备07500843号
返顶部