zoukankan      html  css  js  c++  java
  • 创建有输出参数的存储过程并在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 的设置

  • 相关阅读:
    理解AXI Quad Serial Peripheral Interface(SPI) IP核
    xilinx 高速收发器Serdes深入研究-Comma码(转)
    Zynq-PL中创建AXI Master接口IP及AXI4-Lite总线主从读写时序测试(转)
    一步一步开始FPGA逻辑设计
    万兆网调试(转)
    自定义AXI-IP核(转)
    在嵌入式设计中使用MicroBlaze(Vivado版本)(转)
    MicroBlaze核的串行接口实验:SPI UART
    Git超实用总结
    无法获取 vmci 驱动程序版本: 句柄无效
  • 原文地址:https://www.cnblogs.com/aguan/p/3917190.html
Copyright © 2011-2022 走看看