不足之处,欢迎指正!

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

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 的设置

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

  1. C# 调用带输入输出参数的存储过程

    //调用存储过程执行类似于2//select count(*) from userinfo where username=username and pwd=pwd and grade=grade3// ...

  2. 用exec调用带有output输出参数的存储过程

    用exec调用带有output输出参数的存储过程,想要得到输出参数的值,必须在调用参数后面加output关键字,如: declare @value int exec up_test    2,3,@v ...

  3. sqlserver 带输出参数的存储过程的创建与执行

    创建 use StudentManager go if exists(select * from sysobjects where name='usp_ScoreQuery4') drop proce ...

  4. Oracle带输入输出参数的存储过程

    (一)使用输入参数 需求:在emp_copy中添加一条记录,empno为已有empno的最大值+1,ename不能为空且长度必须大于0,deptno为60. 创建存储过程: create or rep ...

  5. c#调用带输出参数的存储过程

    sql server中编写一个存储过程: CREATE PROCEDURE ProGetPWD @username varchar(20), @password varchar(20) OUTPUT ...

  6. ExecuteReader在执行有输出参数的存储过程时拿不到输出参数

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 后期会在博客首发更新:http://dnt.dkill.net/Article/D ...

  7. sqlserver 带输出参数的存储过程

    --创建存储过程create procedure proc_stu@sname varchar(20),@pwd varchar(50),@flag bit outputasif exists(sel ...

  8. C#调用存储过程带输出参数或返回值

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...

  9. [转] ADO.NET调用存储过程带输出参数或返回值

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(), @studentname nvarchar() OUTPUT AS BEGIN S ...

随机推荐

  1. Eclipse中插件的使用:maven /ant /tomcat

    一:使用Eclipse构建Maven项目 http://blog.csdn.net/jackgaolei/article/details/11332249 二:Maven介绍,包括作用.核心概念.用法 ...

  2. [cf839d]Winter is here容斥原理

    题意:给定一个数列${a_i}$,若子序列长度为$k$,最大公约数为$gcd$,定义子序列的权值为$k*\gcd (\gcd  > 1)$.求所有子序列的权值和. 答案对10^9+7取模. 解题 ...

  3. CSS学习系列1 - CSS中的盒子模型 box model

    css中有一个盒子模型的概念. 主要是用来告诉浏览器如何来计算页面元素的宽度和高度, 比如该元素的宽度/高度 是否包括内边距,边框,外边距.  盒子模型有一个属性box-sizing属性来说明是否包括 ...

  4. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第五篇(用户管理之“用户权限分配”)

    一.在做权限分配之前,首先先了解“ZTree”这个插件,我的这个系统没有用Jquery-EasyUI的Tree.用的是”ZTree“朋友们可以试试,也很强大.点击下载ZTree插件.       1. ...

  5. CSS类名命名规则

    CSS样式命名 说明 网页公共命名 #wrapper 页面外围控制整体布局宽度 #container或#content 容器,用于最外层 #layout 布局 #head, #header 页头部分 ...

  6. javascript不用正则验证输入的字符串是否为空(包含空格)

    在项目中需要验证输入的字符串是否为空,包括空格,不太喜欢使用正则,所以就想到了js的indexOf函数,indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,如果要检索的字符串值没 ...

  7. PPT2010学习笔记(共20讲)

    第1讲  商务PPT中的必备元素 # 设计需打破规范 第2讲  封面页设计(一) 大图型封面页 # 基础知识点: 插入矩形和圆形 设置半透明色 设置字体变形效果 图片增强工具 利用过渡色虚化图片边缘 ...

  8. 飘逸的python - 单例模式乱弹

    方法一:装饰器 利用“装饰器只会执行一次”这个特点 def singleton(cls): instances = []# 为什么这里不直接为None,因为内部函数没法访问外部函数的非容器变量 def ...

  9. 《OD大数据实战》Mahout入门实例

    一.环境搭建 1. 下载 mahout-0.9-cdh5.3.6.tar.gz 2. 解压 3. mahout org.apache.mahout.clustering.syntheticcontro ...

  10. 数组API(2)

    ES5中数组新增API: 1. indexOf 作用:检测当前数据是否在数组中存在: 特点:如果存在返回相对应的下标,如果不存在则返回-1: 如果数组中存在多个需要判断的这个数据,则返回最近的这个数据 ...