1.根据需求创建存储过程:
ALTER PROC [dbo].[Query_ProductNameAndPrice]
@productNO INT,
@procudtName VARCHAR(50) OUTPUT,
@price MONEY OUTPUT
AS
SELECT * FROM Product WHERE ProductNo=@productNO
SELECT @procudtName=ProductName,@price=Price FROM Product WHERE ProductNo=@productNO
第一条sql语句的添加是为了执行完存储过程后,Dapper会自动根据配置将数据封装到对象中(而且此对象必须是原始类型(数据表对应的实体类,而不是自定义的中间实体类)).
第二条sql语句,为了是设置必要的输出参数(outpiut)
存储过程,在创建完成后就已经预编译过了,以后直接调用即可。
2.在Dapper框架中调用存储过程:
使用Dapper提供的扩展方法,调用存储过程
Query<T>(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);
///
/// 在Dapper中调用存储过程(查询操作)
///
public static void CallStoredProcess() {
try
{
using (SqlConnection connect=new SqlConnection(ConnectStr))
{
string procudtName = string.Empty;
decimal price = 0;
//设置输入输出参数
DynamicParameters dp = new DynamicParameters();
dp.Add("@productNO",1013, DbType.Int16);//输入参数
dp.Add("@procudtName",procudtName,DbType.String,ParameterDirection.Output,20);
dp.Add("@price",price,DbType.Decimal,ParameterDirection.Output);
//执行存储过程
//方法1:
//connect.Execute("Query_ProductNameAndPrice",dp,null,null,CommandType.StoredProcedure);
//方法2:可以返回查询结果
//Query_ProductNameAndPrice 为存储过程名称
//设置commandType为存储过程
Product product= connect.Query<Product>("Query_ProductNameAndPrice",dp,commandType:CommandType.StoredProcedure).Single();
//获取输出参数
procudtName = dp.Get<string>("@procudtName");
price = dp.Get<decimal>("@price");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Result:
Product对象:
输出参数:
第二个测试的存储过程:
ALTER PROC [dbo].[ProductInserted]
@procudtName VARCHAR(50),
@price MONEY,
@description VARCHAR(50)
AS
INSERT INTO Product(ProductName,Price,Description) VALUES(@procudtName,@price,@description)
Codes:
///
///调用Insert存储过程(不包含输出参数) --使用匿名函数参数化赋值
///
public static void CallStoredProcess02()
{
try
{
using (SqlConnection connect = new SqlConnection(ConnectStr))
{
int result= connect.Execute("ProductInserted",new {@procudtName= "东风本田 UR-V ",@price=250000,@description= "2017款 1.5T 无级2 40TURBO "},commandType: CommandType.StoredProcedure);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}