Dapper学习 - Dapper的基本用法(二) - 存储过程/函数

作者:编程技术

那边自个儿创建了多个存款和储蓄进程, 三个是有再次来到参数的, 另贰个并未.

//方法一

sql = "call pro_test(@id);";
var res = conn.Query<int>(sql, new { id = 15 }).FirstOrDefault();  //85
Console.WriteLine("res = "   res);  //res = 85

//方法二
var param = new DynamicParameters();
param.Add("@idIn", 20);
param.Add("@count", 0, DbType.Int32, ParameterDirection.Output);
var res2 = conn.Query<Tch_Teacher>("pro_test1", param, null, true, null, CommandType.StoredProcedure);//res2.Count = 80
Console.WriteLine("Query count = "   param.Get<object>("@count"));   //Query count = 80

//方法三
var res3 = conn.Execute("pro_test1", param, null, null, CommandType.StoredProcedure); //0
Console.WriteLine("Execute count = "   param.Get<object>("@count"));  //Execute count = 80
Delimiter $$
drop function if exists func_test;
CREATE FUNCTION func_test (idIn INT) RETURNS int
BEGIN
DECLARE res int DEFAULT 0;
select count(1) into res from tch_teacher where id > idIn ;
return res;
END $$
Delimiter ;

诚如的话, 作者习贯使用办法风华正茂, 相比平价, 因为函数这里并未回去参数, 在利用时, 没有必要在sql中定义参数, 然后实行. 方法一是很便利的

上风姿浪漫篇貌似少介绍了自定义函数和仓库储存进程, 因为那三个也足以利用查询的措施来落时间效益果与利益, 那意气风发篇就补上

 

此种方法在调用存款和储蓄进度的时候也得以顺应部分情状. 请看下边分解

 

//方法一 : 直接写sql, 然后用Query调用
sql = "select func_test(@id);";
var res = conn.Query<int>(sql, new { id = 10 }).FirstOrDefault();  //90
Console.WriteLine("Count = "   res); //Count = 90

//方法二 : 直接用Query方法, 传入函数名, 参数, 但是注意要把CommondType设置为StoredProcedure
//而且调用的时候, 是必须要有 Return参数的, 否则会报错
var para = new  DynamicParameters();
para.Add("@idIn", 20);
para.Add("@res", 0, DbType.Int32, ParameterDirection.ReturnValue);
var res1 = conn.Query("func_test", para, null, true, null, CommandType.StoredProcedure).FirstOrDefault();  //0
Console.WriteLine("Query @res = "   para.Get<int>("@res"));  //Query @res = 80

//方法三 : 使用Execute方法也是可以的, 要注意加一个返回参数
var param = new DynamicParameters();
param.Add("@idIn", 25);
param.Add("@res", 0, DbType.Int32, ParameterDirection.ReturnValue);
var res2 = conn.Execute("func_test", param, null, null, CommandType.StoredProcedure);  //0
Console.WriteLine("Execute @res = "   param.Get<int>("@res"));  //Execute @res = 75

 

二、存款和储蓄进度的始建和调用

假设存款和储蓄进度有输入参数, 那么方法生龙活虎并不适用, 会报错的. Dapper解析到"@count"的时候, 会报错.

留心在mysql中, delimiter $$ 那些的运用, 起叁个细分功用, 有个别编写翻译器中, 如若不写这几个, 是不会把那一个作为方法,存款和储蓄进度去管理的, 而是当作普通查询语句, 会报错的.

Delimiter $$
drop PROCEDURE if EXISTS pro_test;
create PROCEDURE pro_test(in idIn int)
begin
select count(1) as Count from tch_teacher where id > idIn;
end $$
Delimiter ;

Delimiter $$
drop PROCEDURE if EXISTS pro_test1;
create PROCEDURE pro_test1(in idIn int, out count int)
begin
select count(1) into count from tch_teacher where id > idIn;
select * from tch_teacher where id > idIn;
end $$
Delimiter ;

call pro_test(11);

set @count =0;
call pro_test1(11, @count);
select @count;

 后生可畏、自定义函数的始建和调用 (mysql的卡塔尔(英语:State of Qatar)

以下是调用方法:

据此, 对于仓储进程, 推荐适用方法二, 当然, 在未曾出口参数的时候, 方法风度翩翩更为简易凶狠.

本文由分分快三计划发布,转载请注明来源

关键词: