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

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

  1. Delimiter $$
  2. drop function if exists func_test;
  3. CREATE FUNCTION func_test (idIn INT) RETURNS int
  4. BEGIN
  5. DECLARE res int DEFAULT 0;
  6. select count(1) into res from tch_teacher where id > idIn ;
  7. return res;
  8. END $$
  9. Delimiter ;

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

以下是调用方法:

  1. //方法一 : 直接写sql, 然后用Query调用
  2. sql = "select func_test(@id);";
  3. var res = conn.Query<int>(sql, new { id = }).FirstOrDefault(); //
  4. Console.WriteLine("Count = " + res); //Count = 90
  5.  
  6. //方法二 : 直接用Query方法, 传入函数名, 参数, 但是注意要把CommondType设置为StoredProcedure
  7. //而且调用的时候, 是必须要有 Return参数的, 否则会报错
  8. var para = new DynamicParameters();
  9. para.Add("@idIn", );
  10. para.Add("@res", , DbType.Int32, ParameterDirection.ReturnValue);
  11. var res1 = conn.Query("func_test", para, null, true, null, CommandType.StoredProcedure).FirstOrDefault(); //
  12. Console.WriteLine("Query @res = " + para.Get<int>("@res")); //Query @res = 80
  13.  
  14. //方法三 : 使用Execute方法也是可以的, 要注意加一个返回参数
  15. var param = new DynamicParameters();
  16. param.Add("@idIn", );
  17. param.Add("@res", , DbType.Int32, ParameterDirection.ReturnValue);
  18. var res2 = conn.Execute("func_test", param, null, null, CommandType.StoredProcedure); //
  19. Console.WriteLine("Execute @res = " + param.Get<int>("@res")); //Execute @res = 75

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

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

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

  1. Delimiter $$
  2. drop PROCEDURE if EXISTS pro_test;
  3. create PROCEDURE pro_test(in idIn int)
  4. begin
  5. select count(1) as Count from tch_teacher where id > idIn;
  6. end $$
  7. Delimiter ;
  8.  
  9. Delimiter $$
  10. drop PROCEDURE if EXISTS pro_test1;
  11. create PROCEDURE pro_test1(in idIn int, out count int)
  12. begin
  13. select count(1) into count from tch_teacher where id > idIn;
  14. select * from tch_teacher where id > idIn;
  15. end $$
  16. Delimiter ;
  17.  
  18. call pro_test(11);
  19.  
  20. set @count =0;
  21. call pro_test1(11, @count);
  22. select @count;

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

  1. //方法一
  1. sql = "call pro_test(@id);";
  2. var res = conn.Query<int>(sql, new { id = }).FirstOrDefault(); //
  3. Console.WriteLine("res = " + res); //res = 85
  4.  
  5. //方法二
  6. var param = new DynamicParameters();
  7. param.Add("@idIn", );
  8. param.Add("@count", , DbType.Int32, ParameterDirection.Output);
  9. var res2 = conn.Query<Tch_Teacher>("pro_test1", param, null, true, null, CommandType.StoredProcedure);//res2.Count = 80
  10. Console.WriteLine("Query count = " + param.Get<object>("@count")); //Query count = 80
  11.  
  12. //方法三
  13. var res3 = conn.Execute("pro_test1", param, null, null, CommandType.StoredProcedure); //
  14. Console.WriteLine("Execute count = " + param.Get<object>("@count")); //Execute count = 80

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

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

Dapper学习 - Dapper的基本用法(二) - 存储过程/函数的更多相关文章

  1. Dapper学习(三)之其他用法

    这里说的其他用法,是指 Async,Buffered,Transaction,Stored Procedure. 1. 首先 dapper支持异步 ExecuteAsync, QueryAsync, ...

  2. Dapper学习 - Dapper的基本用法(三) - CUD

    之前介绍了Dapper的查询, 存储过程, 函数的调用, 接下来要说一下Dapper的增删改, 其实Dapper的增删改, 都是同一种模式的. 我就不分开介绍了, 直接在一个例子上展现好了. var ...

  3. Dapper学习 - Dapper的基本用法(一) - 查询

    上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面 ...

  4. Dapper学习 - Dapper.Rainbow(二) - Update/Delete

    上一篇介绍了Rainbow的Create方法, 这里就来介绍一下Update方法吧, 毕竟新增和修改是双胞兄弟嘛. 一.Update 1. 测试代码: var conStr = Configurati ...

  5. Dapper学习 - Dapper.Rainbow(三) - Read

    前面已经介绍了新增/修改/删除了, 接下来介绍一下Rainbow的Read方法. 一.Read -- Rainbow原生 1. 先看测试代码 var conStr = ConfigurationMan ...

  6. Dapper学习 - Dapper.Rainbow(一) - Create

    Dapper这个ORM有许多扩展, 我自己用过两种, 也算是比较主流的两种, Rainbow和Extension, 这里就先介绍下Rainbow吧, 毕竟这个先用, 当然, 由于我使用的是mysql数 ...

  7. Knockout.Js官网学习(Mapping高级用法二)

    使用ignore忽略不需要map的属性 如果在map的时候,你想忽略一些属性,你可以使用ignore累声明需要忽略的属性名称集合: " }; var mapping = { 'ignore' ...

  8. dapper 学习

    上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面 ...

  9. 我的MYSQL学习心得(十) 自定义存储过程和函数

    我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...

随机推荐

  1. (小常识)Dictionary的遍历

                Dictionary<int, string> objDictionary = new Dictionary<int, string>();       ...

  2. [ACM_动态规划] Palindrome

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/D 题目大意:给一个长为n的字符串,问最少插入几个字符成回文串 ...

  3. PHP爬虫(2)DOM处理

    摘要:在PHP爬虫(1)中详细了介绍了CURL抓取HTML数据的技术.采集数据处理也是爬虫技术中非常重要的部分.处理HTML数据可以用字符串查找,也可以利用正则表达式,但采用Dom处理是最高级的方法. ...

  4. 诡异的 未处理的IOErrorEvent 2035

    今天游戏发布上线之后,总是随机的出现卡死. 换了个safari之后,看到抛了 IOErrorEvent. 问题是,我所有的Loader都加入了contentLoaderInfo监听.而抛出来的又没有堆 ...

  5. Redis服务器的启动过程分析

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文将通过分析代码来介绍Redis的 ...

  6. scp命令[转]

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  7. struts2学习笔记之七:Result类型

    一:关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法 他们体现了策略模式,具体Result类型参见:struts-default ...

  8. fir.im Weekly - 做一款 App 需要考虑什么

    开发 App 是一个痛并快乐的旅程.工具越来越多,成本也越来越低,那么在开发之前需要考虑些什么?limboy 总结了一些经验和反思--做一个 App 前需要考虑的几件事,参考一下为你的 App 多留点 ...

  9. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  10. 处于同一个域中的两台Sql server 实例无法连接

    处于同一个域中的两台Sql server 实例无法连接,报的错误信息如下: A network-related or instance-specific error occurred while es ...