有几种方法
第一种: 如果你的表中有主键ID, 可以直接按ID号取每页的数据。直接用SQL语句就行,这里不例举了。
第二种: 使用存储过程分页取数据,再填充到dataGridView中。
①当你的表中没有主键ID的时候
- CREATE PROCEDURE dbo.PageCut
- (
- @pageSize int ,--每页显示的条数
- @pageIndex int --当前页
- )
- AS
- SET NOCOUNT ON
- declare @sqlstr varchar(1000)
- set @sqlstr = 'select top '+ str(@pageSize) +' * from(select top '+ str(@pageIndex*@pageSize) +
- '* from mainTable order by software) as a order by software desc '
- --原sql语句 select top 5 * from(select top 10 * from mainTable order by software )as a order by software desc
- --如果是第二页每页5条,那么返回的就是 取前面5*2 = 10条数据(第二句select),把这10条数据desc逆序反过来,再在这10条数据里面取前面pagesize=5条,也就是后面倒数5条
- exec(@sqlstr);
- RETURN
str()将int型转为string型,winform中只需要调用这个带参数的存储过程就行了。如下:
- //
- //取出第X页填充datagridview
- public void cutPages()
- {
- //调用PageCut存储过程
- SqlCommand comm = new SqlCommand("PageCut", conn);
- comm.CommandType = CommandType.StoredProcedure;
- SqlParameter para1 = new SqlParameter("@pageSize", SqlDbType.Int);
- SqlParameter para2 = new SqlParameter("@pageIndex", SqlDbType.Int);
- para1.Value = PAGESIZE;
- para2.Value = PAGEINDEX;
- comm.Parameters.Add(para1);
- comm.Parameters.Add(para2);
- DataSet ds = new DataSet();
- SqlDataAdapter da = new SqlDataAdapter(comm);
- da.Fill(ds, "mainTable");
- dataGridView1.DataSource = ds.Tables["mainTable"].DefaultView;
- comm.Dispose();
- da.Dispose();
- ds.Dispose();
- }
不过我发现这种取倒数第pageSize条的方法的最后1页会将表中最后的pageSize条数据都取出来,例如:pageSize=5,最后一页只有2条的时候,会取出5条数据。
②当你的表中有主键ID的时候
存储过程中的组合sql这样写:
- SELECT TOP 100 *
- FROM testPROC
- WHERE (testid NOT IN (SELECT TOP 19910 testid FROM testPROC ORDER BY testid))ORDER BY testid
它的意思是: 子句的select的意思是查询表的前19910个数据,主句where的意思是说 testId不在(NOT IN)子句查询出来的19910个结果当中的前100个。整个语句其实取的是表的第19910个数据开始往下到第20000个,这中间的100个数据。
或者是这样写:
- SELECT
- TOP 10 * FROM TestTable
- WHERE
- (ID >(SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS T))
- ORDER BY ID
它的意思是:从testTable中取出top20条,然后得到这20条中最大的ID号“20”,然后主句就从ID>20开始取10个,这样就取到了21-30这10个数据。
第三种: 使用dataAdapter.Fill()方法。
如果你的表中没有设置主键,那只能按照数据库中的第m条数据-->第n条数据这中方式来取。
dataAdapter.Fill()方法有13个重载方法,其中有个Fill(DataSet, Int32, Int32, String)方法,参数为(dataSet,开始条数, 取多少条,dataSet中的表名)。
代码如下:
- private const int pageSize = 5; //每页的条数
- private int startIndex = 0;//默认开始条为第0条
- public Form1()
- {
- InitializeComponent();
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- openConn(pageindex);
- }
- /// <summary>
- ///
- /// 打开连接,绑定数据源
- /// </summary>
- /// <param name="si">startIndex,开始的条目序号</param>
- private void openConn(int si) {
- string conStr = "Data Source=COMPANY-B03B094;Initial Catalog=AccountManager;Persist Security Info=True;User ID=sa;Password=sa;Pooling=False";
- SqlConnection con = new SqlConnection(conStr);
- SqlDataAdapter da = new SqlDataAdapter("select * from mainTable", con);
- DataSet ds = new DataSet();
- da.Fill(ds, si, pageSize, "mainTable");
- dataGridView1.DataSource = ds.Tables[0].DefaultView;
- con.Open();
- con.Close();
- da.Dispose();
- ds.Dispose();
- }
- private void button1_Click(object sender, EventArgs e)//下一页
- {
- openConn(startIndex += pageSize);//每点击一次下一页就将开始的序号加pageSize
- }
- private void button2_Click(object sender, EventArgs e)//上一页
- {
- openConn(startIndex -= pageSize);
- }