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

9/1/2015来源:SQL技巧人气:1759

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

不足之处,欢迎指正!

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

if exists(select * from sysobjects where name='usp_getPage1')drop PRocedure usp_getPage1gocreate 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 intexecute usp_getPage1 @count=@num outputprint @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 的设置