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)
end

--调用前定义输出参数
declare @rc int,@pc int
exec usp_getMyStudentsDataByPage @pagesize=7,@pageindex=4, @[email protected] output,@[email protected] 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对象后,才能获取输出参数。

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

时间: 2024-10-11 12:19:19

ADO调用分页查询存储过程的相关文章

SQLServer分页查询存储过程

项目中用到的SQLServer分页查询存储过程. [存储过程] create PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage int = 1,                         --当前页页码 (即Top currPage) @showColumn varchar(2000) = '*',           --需要得到的字段 (即 column1,column2,......) @strCondition varchar(200

【原创】SQL分页查询存储过程

1 ------------------------------------- 2 -----作者:张欣宇 3 -----时间:2013-06-28 4 -----简介:根据参数和条件分页查询 5 ------------------------------------- 6 Create proc [dbo].[Up_PagingQueryByParameter] 7 ( 8 ----- 表名或能查询到结果的SQL语句{SQL语句左右必须有括号例:(select * from tbl1)} 9

SQL Server 分页查询存储过程

1.低效的分页 SELECT TOP m-n+1 * FROM publish WHERE (id NOT IN (SELECT TOP n-1 id FROM publish)) 但这个存储过程有一个致命的缺点,就是它含有NOT IN字样.虽然我可以把它改造为: SELECT TOP 页大小 * FROM Table1 WHERE not exists (select * from (select top (页大小*页数) * from table1 order by id) b where

JAVA学习之 实现分页查询

分页是系统中常用到的功能,只要涉及到查询必定伴随而来的就是分页,之前也学习过关于分页的内容,例如在牛腩的新闻发布系统,之前学习的大部分都是使用了假分页,这次学习java,使用Oracle数据库来实现一下真分页. 首先来说一下实现这个分页查询的流程: 一.封装分页信息: 需要分页的部分我们首先要做的是为分页封装一个分页实体,方便返回查询信息,封装如下: /** *封装分页信息 * @author YoungJong * */ public class PageModel<E> { //结果集 p

数据库分页查询方法

在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法. 可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用. 下面就分别给大家介绍.讲解一下三种数据库实现分页查询的方法. 一. MySQL 数据库分页查询 MySQL数据库实现分页比较简单,提供了LIMIT函数.一般只需要直接写到sql语句后面就行了. LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有

java连接oracle数据库调用存储过程实现分页查询(emp为例)

第一步:建一个含游标类型的包 sql>create or replace package testPackage as type test_cursor is ref cursor;    --定义名为test_cursor 的游标 end testPackage; 第二步:编写分页的存储过程 sql>create or replace procedure fenYe( tableName in varchar2,--表名 pageSize in number,--每页显示的记录数 pageN

存储过程分页 Ado.Net分页 EF分页 满足90%以上

存储过程分页: 1 create proc PR_PagerDataByTop 2 @pageIndex int, 3 @pageSize int, 4 @count int out 5 as 6 select top(@pageSize) * from dbo.userInfo where ID not in 7 ( 8 select top((@pageIndex-1)*@pageSize) ID from dbo.userInfo 9 ) 10 set @count = (select C

oracle入门(8)——实战:支持可变参数、多种条件、多个参数排序、分页的存储过程查询组件

[本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情况下才更快. 经非专业的测试,在有分页的情况下,在300万条数据里面查询的时间保持在0.1秒内.相同查询条件+分页的情况下,hibernate 用时0.3秒内. 不分页的条件下,查出来的数据越多,时间越长,时间长的话,跟hibernate相相比就没什么优势了. [思路] 我的思路是从java传来”字

bos 第5天(定区的添加、定区的分页查询、hessian远程调用实现获取客户信息)

BOS项目笔记 第5天 今天内容安排: 1.添加定区功能 2.定区分页查询 3.hessian入门----远程调用技术 4.基于hessian实现定区关联客户 1. 添加定区 定区可以将取派员.分区.客户信息关联到一起. 页面:WEB-INF/pages/base/decidedzone.jsp 第一步:使用下拉框展示取派员数据,修改combobox的URL地址,发送请求 第二步:在StaffAction中提供listajax方法,查询没有作废的取派员,返回json数据 第三步:在StaffSe