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);
        }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM