您的位置:首页 > 其它

ADO调用分页查询存储过程

2017-12-11 23:20 288 查看

 

一、分页存储过程

----------使用存储过程编写一个分页查询-----------------------
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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: