以下是學習筆記:
一,一般存儲過程的調用
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); }