创建有输出参数的存储过程并在c#中实现DataGridView分页功能

不足之处,欢迎指正!

创建有输出参数的存储过程

if exists(select * from sysobjects where name='usp_getPage1')
drop procedure usp_getPage1
go
create procedure usp_getPage1--存储过程名称
@count int output,--输出参数
@countIndex int=1,--参数带默认值
@countPage int=5--参数带默认值
as 
--一个sql语句。ROW_NUMBER ( ) OVER ()返回结果集分区内行的序列号,每个分区的第一行从 1 开始,这里给别名id。temp也是一个别名,是前面括号的数据
select * from(select row_number()over(order by studentno)id,* from student)temp where id >(@countIndex-1)*@countPage and id<=@countIndex*@countPage
--给输出参数赋值
set @count=ceiling((select count(*) from student)*1.0/@countPage) 
--ceiling四舍五入的节奏,乘以1.0呢,是因为int除以int还是得到int。浮点型除以整型得到浮点型
go
--执行存储过程,有默认值的可以不给值,但是输出参数需要声明一个变量接收
declare @num int
execute usp_getPage1 @count=@num output
print @num

 



  创建一个类,里面有一个静态方法,等下会调用,引用命名空间

using System.Data;
using System.Data.SqlClient;

 class SqlHelper
    {
        public static readonly string connStr = "Data Source=.;Initial Catalog=MySchoolMoreData;Integrated Security=True";
        /// <summary>
        /// 三个参数得到数据结果集
        /// </summary>
        /// <param name="commandText">sql命令,存储过程名称</param>
        /// <param name="ctype">命令字符串类型</param>
        /// <param name="ps">参数数据 params关键词表示可为空</param>
        /// <returns>返回DataTable的结果集</returns>
        public static DataTable LoadData(string commandText,CommandType ctype,params SqlParameter[]ps)
        {
            SqlDataAdapter da = new SqlDataAdapter(commandText, connStr);
            da.SelectCommand.Parameters.AddRange(ps);
            da.SelectCommand.CommandType = ctype;
            DataTable dt = new DataTable();
            da.Fill(dt);
            return dt;
        
        }
    }

  界面--一个DataGridView空间,两个Button

声明三个全局变量

       int pageIndex = 1;//页码
        int pageCount = 5; //每一页显示多少个数据
        int count = 0;//接收输出参数的

  

private void Form1_Load(object sender, EventArgs e)界面初始之后的事件

SqlParameter p=new SqlParameter("@count",SqlDbType.Int);//@count 输出参数,和存储过程必须同名。声明类型
p.Direction = ParameterDirection.Output; //告诉服务器的参数输出方向
//调用方法静态
DataTable dt = SqlHelper.LoadData("usp_getPage1", CommandType.StoredProcedure, p);
dgvData.DataSource = dt;//绑定数据
this.count = (int)p.Value;//记录第几页

  在上一页按钮写的事件

private void btnPer_Click(object sender, EventArgs e)
        {   //当页码为1的时候将return
            if (pageIndex==1)
            {
                MessageBox.Show("已经是第一页了");
                return;
             }
            pageIndex--;//点击上一次页码减去1
            //声明参数数组,参数必须和存储过程声明的变量名称一致
            SqlParameter []ps={new SqlParameter("@countIndex",pageIndex),
                              new SqlParameter("@countPage",pageCount),
                              new SqlParameter("@count",SqlDbType.Int)
                            };
            //设置输出参数的方向
            ps[2].Direction = ParameterDirection.Output;
            DataTable dt = SqlHelper.LoadData("usp_getPage1", CommandType.StoredProcedure, ps);//CommandType.StoredProcedure 告诉服务器这是执行一个存储过程不是sql语句
            dgvData.DataSource = dt;//绑定数据
this.count = (int)ps[2].Value;//记录第几页 }

  然后在下一页按钮的事件代码和上一页是差不多的只是变量pageIndex是pageIndex++代码如下:

   private void btnNext_Click(object sender, EventArgs e)
        {
            if (pageIndex==this.count)//不同处
            {
                MessageBox.Show("已经是最后一页了");
                return;
            }
            pageIndex++;//点击下一次页码加1--不同处
            //声明参数数组
            SqlParameter[] ps ={new SqlParameter("@countIndex",pageIndex),
                              new SqlParameter("@countPage",pageCount),
                              new SqlParameter("@count",SqlDbType.Int)
                            };
            //设置输出参数的方向
            ps[2].Direction = ParameterDirection.Output;
            DataTable dt = SqlHelper.LoadData("usp_getPage1", CommandType.StoredProcedure, ps);
            dgvData.DataSource = dt;//绑定数据
            this.count = (int)ps[2].Value;//每一次都要记录输出的值
        }

  

总结:1.存储过程的正确创建很重要

        2.参数的名称一定要和存储过程的变量名称要一致

        3.输出参数一定要声明,同时设置他的方向。

         4.CommandType.StoredProcedure 的设置

原文地址:https://www.cnblogs.com/aguan/p/3917190.html