• C# --SqlServer--调用SQLServer存储过程


    以下是学习笔记:

    一,一般存储过程的调用

    1.1 在SQLHelper中添加方法

            /// <summary>
            /// 执行通用的增,删,改操作
            /// </summary>
            /// <param name="cmdText">slq语句或存储过程名称</param>
            /// <param name="param">参数数组</param>
            /// <param name="isProcedure">是否是存储过程</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(string cmdText, SqlParameter[] param = null,bool isProcedure=false)
            {
                //创建链接对象
                SqlConnection conn = new SqlConnection(connString);
                //创建一个命令执行对象         
                SqlCommand cmd = new SqlCommand(cmdText, conn); //建议直接用构造方法
                try
                {
                    conn.Open();
                    //添加参数
                    if (param != null)
                    {
                        cmd.Parameters.AddRange(param);
                    }
    
                    if (isProcedure)
                    {
                        cmd.CommandType = CommandType.StoredProcedure;//这个枚举的设置表示当前cmdText是存储过程名称 
                    }
                    return cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    //如果有必要可以在这个的记录日志....
                    //注意:我们通用的数据访问类是“底层”地方方法,我们捕获到异常,必须还得告诉调用者具体的异常。
                    string errorMsge = "调用ExecuteNonQuery方法发生异常,具体异常信息:" + ex.Message;
    
                    // throw ex;  //可以直接把ex对象抛出去,也可以做二次封装
    
                    throw new Exception(errorMsge);//也可以这样用,创建一个异常对象
                }
                finally   //表示前面不管是否发生异常,都会执行的代码段
                {
                    conn.Close();
                }
            }
    

     

    1.2,在SQLServer中编写存储过程

    --存储过程编写
    if exists(select * from sysobjects where name='usp_AddProduct')
    drop procedure usp_AddProduct  --如果if后面有多行,必须用begin end。跟C#的{}一行
    go
    create procedure usp_AddProduct
    --存储过程输入参数的定义
    @ProductId varchar(50), --前面加“@”,后面加 数据类型
    @ProductName varchar(50), 
    @UnitPrice numeric(18,2), 
    @Unit varchar(50),
    @CategoryId int,
    @MinCount int, 
    @MaxCount int
    as
      --在这里编写具体的存储过程内容
    
      --在商品信息表中,添加数据
      insert into Products(ProductId, ProductName, UnitPrice, Unit,  CategoryId)
      values(@ProductId, @ProductName, @UnitPrice, @Unit,  @CategoryId)
    
      --同时在商品库存表中,添加数据(因为ProductId是一对一的关系)
      insert into ProductInventory(ProductId, MinCount, MaxCount, TotalCount,StatusId)
      values(@ProductId, @MinCount, @MaxCount,0, -2)
    go
    
    --存储过程调用(测试)
    exec usp_AddProduct '6005004003099','测试商品1',50,'箱',10,100,200
    

    1.3 调用

     

            /// <summary>
            /// 一般存储过程的调用
            /// </summary>
            private static void InsertByProcedure1()
            {
                SqlParameter[] param=new SqlParameter[]
                {
                    new SqlParameter("@ProductId", "6005004003023"),
                    new SqlParameter("@ProductName", "特制绿茶"),
                    new SqlParameter("@UnitPrice", 45),
                    new SqlParameter("@Unit", "箱"),
                    new SqlParameter("@MinCount", 100),
                    new SqlParameter("@MaxCount", 200),
                    new SqlParameter("@CategoryId", 3),
                };
                int result = SQLHelper.ExecuteNonQuery("usp_AddProduct", param, true);
    
                Console.WriteLine("调用存储过程添加商品信息返回受影响的行数:"+result);
            }
    

     

    二,带默认参数的存储过程的调用

     

    2.1,在SQLHelper中添加方法(跟上面方法一样)

     

    2.2   在SQLServer中编写带默认参数的存储过程

     --创建一个存储过程,带参数默认值
     if exists(select * from sysobjects where name='usp_AddProduct2')
    drop procedure usp_AddProduct2
    go
    create procedure usp_AddProduct2
    --存储过程输入参数的定义
    @ProductId varchar(50), 
    @ProductName varchar(50), 
    @UnitPrice numeric(18,2), 
    @Unit varchar(50),
    @CategoryId int,
    @MinCount int, 
    @MaxCount int,
    @TotalCount int=0,  --可以给参数添加默认值,有默认值的参数必须放到后面,方便调用
    @StatusId int=-2      --参数默认值
    as
      --在这里编写具体的存储过程内容
      --在这个地方使用declare声明你要使用的变量...
    
    
      --在商品信息表中,添加数据
      insert into Products(ProductId, ProductName, UnitPrice, Unit,  CategoryId)
      values(@ProductId, @ProductName, @UnitPrice, @Unit,  @CategoryId)
    
      --同时在商品库存表中,添加数据
      insert into ProductInventory(ProductId, MinCount, MaxCount, TotalCount,StatusId)
      values(@ProductId, @MinCount, @MaxCount,@TotalCount,@StatusId)
    
      --如果你声明了自己的参数,可以在这个地方根据你的业务使用...(这个就相当于C#方法中的局部变量)
    
    
    go
    
    --调用带参数默认值的存储过程(测试)
    exec usp_AddProduct2 '7005004003099','测试商品2',60,'箱',10,100,200  --后面两个参数全部使用默认值
    exec usp_AddProduct2 '8005004003099','测试商品3',65,'箱',10,100,200,150,1  --都不使用默认值
    exec usp_AddProduct2 '9005004003099','测试商品4',65,'箱',10,100,200,150 --第2个使用默认值
    exec usp_AddProduct2 '9005004003199','测试商品5',65,'箱',10,100,200, @StatusId=1 --第1个使用默认值
    

      

    2.3 调用

            /// <summary>
            /// 带默认参数的存储过程的调用
            /// </summary>
            private static void InsertByProcedure2()
            {
                SqlParameter[] param = new SqlParameter[]
                {
                    new SqlParameter("@ProductId", "6005004003024"),
                    new SqlParameter("@ProductName", "特制红茶"),
                    new SqlParameter("@UnitPrice", 45),
                    new SqlParameter("@Unit", "箱"),
                    new SqlParameter("@MinCount", 100),
                    new SqlParameter("@MaxCount", 200),
                    new SqlParameter("@CategoryId", 3),
                    new SqlParameter("@TotalCount", 2),//第一个不使用默认值
                };
                int result = SQLHelper.ExecuteNonQuery("usp_AddProduct2", param, true);
    
                Console.WriteLine("调用存储过程添加商品信息返回受影响的行数:" + result);
            }
    

      

    三,带输出参数的存储过程的调用

     

    3.1,在SQLHelper中添加方法(跟上面方法一样)

     

    3.2   在SQLServer中编写输出认参数的存储过程

    ------------------------------带上输入、输出参数的存储过程---------------------
    if exists(select * from sysobjects where name='usp_AddProduct3')
    drop procedure usp_AddProduct3
    go
    create procedure usp_AddProduct3
    --存储过程输入参数的定义
    @ProductId varchar(50), 
    @ProductName varchar(50), 
    @UnitPrice numeric(18,2), 
    @Unit varchar(50),
    @CategoryId int,
    @ProductCount int output,   --定义输出参数
    @MinCount int=100, --默认值参数要放在后面
    @MaxCount int=200
    
    as
    
      --在商品信息表中,添加数据
      insert into Products(ProductId, ProductName, UnitPrice, Unit,  CategoryId)
      values(@ProductId, @ProductName, @UnitPrice, @Unit,  @CategoryId)
    
      --同时在商品库存表中,添加数据
      insert into ProductInventory(ProductId, MinCount, MaxCount, TotalCount,StatusId)
      values(@ProductId, @MinCount, @MaxCount,0, -2)
    
      --获得输出参数
       select @ProductCount=count(*)  from Products
    go
    

      

    3.3 调用

      /// <summary>
            /// 带输出参数的存储过程的调用
            /// </summary>
            private static void InsertByProcedure3()
            {
                //首先要定义输出参数
                SqlParameter outprParam = new SqlParameter("@ProductCount",SqlDbType.Int);//输出参数名称 数据类型
                outprParam.Direction = ParameterDirection.Output;//表示参数是输出参数
                
                SqlParameter[] param = new SqlParameter[]
                {
                    new SqlParameter("@ProductId", "6005004003025"),
                    new SqlParameter("@ProductName", "特制苦茶"),
                    new SqlParameter("@UnitPrice", 60),
                    new SqlParameter("@Unit", "箱"),
                    //new SqlParameter("@MinCount", 100), //使用默认值
                    //new SqlParameter("@MaxCount", 200), //使用默认值
                    new SqlParameter("@CategoryId", 3),
                    outprParam
    
                };
                int result = SQLHelper.ExecuteNonQuery("usp_AddProduct3", param, true);
    
                Console.WriteLine("调用存储过程添加商品信息返回受影响的行数:" + result);
    
                //获取输出参数
                int outResult = (int) outprParam.Value;
                Console.WriteLine("当前商品列表总数(输出参数):" + outResult);
            }
    

      

  • 相关阅读:
    《CoderXiaoban》第八次团队作业:Alpha冲刺5
    《CoderXiaoban》第八次团队作业:Alpha冲刺4
    《CoderXiaoban》第八次团队作业:Alpha冲刺 3
    《CoderXiaoban》第八次团队作业:Alpha冲刺 2
    《CoderXiaoban》第八次团队作业:Alpha冲刺1
    毛毛虫组【Beta】Scrum Meeting 3
    毛毛虫组【Beta】Scrum Meeting 2
    毛毛虫组【Beta】Scrum Meeting 1
    《毛毛虫团队》第九次团队作业:BETA冲刺与团队项目验收
    《毛毛虫组》【Alpha】Scrum meeting 5
  • 原文地址:https://www.cnblogs.com/baozi789654/p/12663333.html
Copyright © 2020-2023  润新知