不足之处,欢迎指正!

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

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. hadoop job 重要性能参数

    name 说明 mapred.task.profile 是否对任务进行profiling,调用java内置的profile功能,打出相关性能信息 mapred.task.profile.{maps|r ...

  2. [转] Hibernate不能自动建表解决办法(hibernate.hbm2ddl.auto) (tables doesn't exist)

    转自: http://blog.csdn.net/biangren/article/details/8010018 最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实 ...

  3. LINQ中的陷阱--TakeWhile&SkipWhile

    在用TakeWhile,SkipWhile设置陷阱之前,我们先来看一看他们的兄弟Take和Skip: public static IEnumerable<T> Take<T>( ...

  4. 关闭QtCreator的vim风格编辑模式

    今天不小心点到了键盘的快捷键Alt+V,使QtCreator进入了vim风格编辑模式,导致快捷键拷贝粘贴都不正常,找了下资料才发现是这个问题.具体操作如下: 打开QtCreator去掉下列位置的勾选或 ...

  5. Asp.net Core 启动流程分析

    新建的.net core 程序启动本质上是一个控制台应用程序,所以它的入口在Main方法中,所以启动的开始时从Main方法开始. public class Program { public stati ...

  6. -bash: ./bak_1.py: /usr/bin/python^M: bad interpreter: 没有那个文件或目录

    在Windows的PyCharm中编写了一个Python文件,然后上传至CentOS中,已经添加执行权限,但是仍然会报如下的错误: 代码如下: #!/usr/bin/python # -*- codi ...

  7. NoSuchMethodError idea解决jar包冲突

    报NoSuchMethodError(使用spring boot框架idea)一般是jar包冲突 Exception in thread"main" java.lang.NoSuc ...

  8. gitlab web端使用

    https://jenkins.io/zh/doc/pipeline/tour/getting-started/ http://www.cnblogs.com/cheng95/p/6542036.ht ...

  9. POJ1013 Counterfeit Dollar

    题目来源:http://poj.org/problem?id=1013 题目大意:有12枚硬币,其中有一枚假币.所有钱币的外表都一样,所有真币的重量都一样,假币的重量与真币不同,但我们不知道假币的重量 ...

  10. 再谈布局,栅栏式自适应布局的学习和实现(calc自适应布局)

    布局真的很重要.一个不好的布局后期会有很多很多的bug,就像是建房子的地基一样. 首先,再一次地圣杯布局的学习,来源于该教程: http://www.jianshu.com/p/f9bcddb0e8b ...