ADO调用分页查询存储过程

Posted hao_1234_1234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADO调用分页查询存储过程相关的知识,希望对你有一定的参考价值。

 

一、分页存储过程

----------使用存储过程编写一个分页查询-----------------------
set nocount off  --关闭SqlServer消息

--set nocount on  --开启SqlServer消息

go
create proc usp_getMyStudentsDataByPage

--输入参数
@pagesize int=7,--每页记录条数
@pageindex int=1,--当前要查看第几页的记录

--输出参数
@recordcount int output,--总的记录的条数
@pagecount int output --总的页数
as
begin
--1.编写查询语句,把用户要的数据查询出来
select
t.fid,
t.fname,
t.fage,
t.fgender,
t.fmath,
t.fclassid,
t.fbirthday
from (select *,rn=row_number() over(order by fid asc) from MyStudent) as t
where t.rn between (@pageindex-1)*@pagesize+1 and @pagesize*@pageindex

--2.计算总的记录条数
set @recordcount=(select count(*) from MyStudent)

--3.计算总页数
set @pagecount=ceiling(@recordcount*1.0/@pagesize)  --乘以1.0转成flot型, 然后celling “进一法”取值
end

 

--调用前定义输出参数
declare @rc int,@pc int
exec usp_getMyStudentsDataByPage @pagesize=7,@pageindex=4, @recordcount=@rc output,@pagecount=@pc output
print @rc
print @pc

 

 

二、ADO调用存储过程

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace _02通过Ado.Net调用存储过程
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private int pageIndex = 1;//当前要查看的页码

        private int pageSize = 7;//每页显示的记录条数


        private int pageCount;//总页数

        private int recordCount;//总条数

        //窗体加载的时候显示第一页的数据
        private void Form1_Load(object sender, EventArgs e)
        {
            LoadData();
        }

        private void LoadData()
        {
            //根据pageIndex来加载数据
            string constr = "Data Source=steve-pc;Initial Catalog=itcast2014;Integrated Security=True";
            #region 1
            //using (SqlConnection conn = new SqlConnection(constr))
            //{
            //    //将sql语句变成存储过程名称
            //    string sql = "usp_getMyStudentsDataByPage";

            //    using (SqlCommand cmd = new SqlCommand(sql, conn))
            //    {
            //        //告诉SqlCommand对象,现在执行的存储过程不是SQL语句
            //        cmd.CommandType = CommandType.StoredProcedure;

            //        //增加参数(存储过程中有几个参数,这里就需要增加几个参数)
            //        //@pagesize int=7,--每页记录条数
            //        //@pageindex int=1,--当前要查看第几页的记录
            //        //@recordcount int output,--总的记录的条数
            //        //@pagecount int output --总的页数
            //        SqlParameter[] pms = new SqlParameter[] { 
            //        new SqlParameter("@pagesize",SqlDbType.Int){Value =pageSize},
            //        new SqlParameter("@pageindex",SqlDbType.Int){Value =pageIndex},
            //        new SqlParameter("@recordcount",SqlDbType.Int){ Direction=ParameterDirection.Output},
            //        new SqlParameter("@pagecount",SqlDbType.Int){Direction=ParameterDirection.Output}
            //        };
            //        cmd.Parameters.AddRange(pms);
            //        //打开连接
            //        conn.Open();
            //        //执行
            //using(SqlDataReader reader=cmd.ExecuteReader())
            //{
                //reader.Read()
            //}
            //pms[2].Value
            //    }
            //}
            #endregion

            //DataAdapter方式
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter("usp_getMyStudentsDataByPage", constr))
            {
                adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
               SqlParameter[] pms = new SqlParameter[] { 
                   new SqlParameter("@pagesize",SqlDbType.Int){Value =pageSize},
                   new SqlParameter("@pageindex",SqlDbType.Int){Value =pageIndex},
                   new SqlParameter("@recordcount",SqlDbType.Int){ Direction=ParameterDirection.Output},
                   new SqlParameter("@pagecount",SqlDbType.Int){Direction=ParameterDirection.Output}
                    };
                adapter.SelectCommand.Parameters.AddRange(pms);
                adapter.Fill(dt);

                //获取输出参数并且赋值给label
                label1.Text = "总条数:" + pms[2].Value.ToString();
                label2.Text = "总页数:" + pms[3].Value.ToString();
                label3.Text = "当前页:" + pageIndex;
               //数据绑定
                this.dataGridView1.DataSource = dt;
            }

        }

        //下一页
        private void button2_Click(object sender, EventArgs e)
        {
            pageIndex++;
            LoadData();
        }

        //上一页
        private void button1_Click(object sender, EventArgs e)
        {
            pageIndex--;
            LoadData();
        }
    }
}

 

 

 

 

效果图:

 

三.通过ado.net调用存储过程与调用带参数的SQL语句的区别。
1>把SQL语句变成了存储过程名称
2>设置SqlCommand对象的CommandType为CommandType.StoredProcedure

这步本质 就是在 存储过程名称前面加了个“ exec  ”
3>根据存储过程的参数来设置SqlCommand对象的参数。
4>如果有输出参数需要设置输出参数的Direction属性为:Direction=ParameterDirection.Output


四.如果是通过调用Command对象的ExecuteReader()方法来执行的该存储过程,那么要想获取输出参数,必须得等到关闭reader对象后,才能获取输出参数。

 

来源:传智播客 视频教程。

ROW_NUMBER() OVER函数的基本用法

https://jingyan.baidu.com/article/9989c74604a644f648ecfef3.html

 

以上是关于ADO调用分页查询存储过程的主要内容,如果未能解决你的问题,请参考以下文章

delphi怎样在ADO里用ADOproc调用数据库sql server存储过程?,用ADODATASET或者ADOQUERY又怎样调用存储过程?

关于SQL分页存储过程的分析

在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询

如何使用 ado.net 调用存储过程

Ado调用存储过程

ADO.NET 调用 T-SQL 存储过程会导致 SqlTimeoutException