你的位置:首页 > ASP.net教程

[ASP.net教程]Dapper学习


上一篇貌似少介绍了自定义函数和存储过程, 因为这两个也可以使用查询的方式来实现功能, 这一篇就补上

 一、自定义函数的创建和调用 (mysql的)

Delimiter $$drop function if exists func_test;CREATE FUNCTION func_test (idIn INT) RETURNS intBEGINDECLARE res int DEFAULT 0;select count(1) into res from tch_teacher where id > idIn ;return res;END $$Delimiter ;

注意在mysql中, delimiter $$ 这个的使用, 起一个分割功能, 有些编译器中, 如果不写这个, 是不会把这些当做方法,存储过程去处理的, 而是当做普通查询语句, 会报错的.

以下是调用方法:

//方法一 : 直接写sql, 然后用Query调用sql = "select func_test(@id);";var res = conn.Query<int>(sql, new { id = 10 }).FirstOrDefault(); //90Console.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(); //0Console.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); //0Console.WriteLine("Execute @res = " + param.Get<int>("@res")); //Execute @res = 75

一般来说, 我习惯使用方法一, 比较方便, 因为函数这里并没有返回参数, 在使用时, 不需要在sql中定义参数, 然后执行. 方法一是很方便的

此种方法在调用存储过程的时候也可以符合部分情况. 请看下面分解

 

二、存储过程的创建和调用

Delimiter $$drop PROCEDURE if EXISTS pro_test;create PROCEDURE pro_test(in idIn int)beginselect 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)beginselect 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;

 

这里我创建了两个存储过程, 一个是有返回参数的, 另一个并没有.

//方法一
sql = "call pro_test(@id);";var res = conn.Query<int>(sql, new { id = 15 }).FirstOrDefault(); //85Console.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 = 80Console.WriteLine("Query count = " + param.Get<object>("@count"));  //Query count = 80//方法三var res3 = conn.Execute("pro_test1", param, null, null, CommandType.StoredProcedure); //0Console.WriteLine("Execute count = " + param.Get<object>("@count")); //Execute count = 80

如果存储过程有输入参数, 那么方法一并不适用, 会报错的. Dapper解析到"@count"的时候, 会报错.

所以, 对于存储过程, 推荐适用方法二, 当然, 在没有输出参数的时候, 方法一更为简单粗暴.