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