不足之处,欢迎指正!
创建有输出参数的存储过程
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 的设置