Dapper学习 - Dapper的基本用法(二) - 存储过程/函数
上一篇貌似少介绍了自定义函数和存储过程, 因为这两个也可以使用查询的方式来实现功能, 这一篇就补上
一、自定义函数的创建和调用 (mysql的)
- 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 ;
注意在mysql中, delimiter $$ 这个的使用, 起一个分割功能, 有些编译器中, 如果不写这个, 是不会把这些当做方法,存储过程去处理的, 而是当做普通查询语句, 会报错的.
以下是调用方法:
- //方法一 : 直接写sql, 然后用Query调用
- sql = "select func_test(@id);";
- var res = conn.Query<int>(sql, new { id = }).FirstOrDefault(); //
- Console.WriteLine("Count = " + res); //Count = 90
- //方法二 : 直接用Query方法, 传入函数名, 参数, 但是注意要把CommondType设置为StoredProcedure
- //而且调用的时候, 是必须要有 Return参数的, 否则会报错
- var para = new DynamicParameters();
- para.Add("@idIn", );
- para.Add("@res", , DbType.Int32, ParameterDirection.ReturnValue);
- var res1 = conn.Query("func_test", para, null, true, null, CommandType.StoredProcedure).FirstOrDefault(); //
- Console.WriteLine("Query @res = " + para.Get<int>("@res")); //Query @res = 80
- //方法三 : 使用Execute方法也是可以的, 要注意加一个返回参数
- var param = new DynamicParameters();
- param.Add("@idIn", );
- param.Add("@res", , DbType.Int32, ParameterDirection.ReturnValue);
- var res2 = conn.Execute("func_test", param, null, null, CommandType.StoredProcedure); //
- Console.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)
- 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;
这里我创建了两个存储过程, 一个是有返回参数的, 另一个并没有.
- //方法一
- sql = "call pro_test(@id);";
- var res = conn.Query<int>(sql, new { id = }).FirstOrDefault(); //
- Console.WriteLine("res = " + res); //res = 85
- //方法二
- var param = new DynamicParameters();
- param.Add("@idIn", );
- param.Add("@count", , 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); //
- Console.WriteLine("Execute count = " + param.Get<object>("@count")); //Execute count = 80
如果存储过程有输入参数, 那么方法一并不适用, 会报错的. Dapper解析到"@count"的时候, 会报错.
所以, 对于存储过程, 推荐适用方法二, 当然, 在没有输出参数的时候, 方法一更为简单粗暴.
Dapper学习 - Dapper的基本用法(二) - 存储过程/函数的更多相关文章
- Dapper学习(三)之其他用法
这里说的其他用法,是指 Async,Buffered,Transaction,Stored Procedure. 1. 首先 dapper支持异步 ExecuteAsync, QueryAsync, ...
- Dapper学习 - Dapper的基本用法(三) - CUD
之前介绍了Dapper的查询, 存储过程, 函数的调用, 接下来要说一下Dapper的增删改, 其实Dapper的增删改, 都是同一种模式的. 我就不分开介绍了, 直接在一个例子上展现好了. var ...
- Dapper学习 - Dapper的基本用法(一) - 查询
上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面 ...
- Dapper学习 - Dapper.Rainbow(二) - Update/Delete
上一篇介绍了Rainbow的Create方法, 这里就来介绍一下Update方法吧, 毕竟新增和修改是双胞兄弟嘛. 一.Update 1. 测试代码: var conStr = Configurati ...
- Dapper学习 - Dapper.Rainbow(三) - Read
前面已经介绍了新增/修改/删除了, 接下来介绍一下Rainbow的Read方法. 一.Read -- Rainbow原生 1. 先看测试代码 var conStr = ConfigurationMan ...
- Dapper学习 - Dapper.Rainbow(一) - Create
Dapper这个ORM有许多扩展, 我自己用过两种, 也算是比较主流的两种, Rainbow和Extension, 这里就先介绍下Rainbow吧, 毕竟这个先用, 当然, 由于我使用的是mysql数 ...
- Knockout.Js官网学习(Mapping高级用法二)
使用ignore忽略不需要map的属性 如果在map的时候,你想忽略一些属性,你可以使用ignore累声明需要忽略的属性名称集合: " }; var mapping = { 'ignore' ...
- dapper 学习
上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面 ...
- 我的MYSQL学习心得(十) 自定义存储过程和函数
我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...
随机推荐
- (小常识)Dictionary的遍历
Dictionary<int, string> objDictionary = new Dictionary<int, string>(); ...
- [ACM_动态规划] Palindrome
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/D 题目大意:给一个长为n的字符串,问最少插入几个字符成回文串 ...
- PHP爬虫(2)DOM处理
摘要:在PHP爬虫(1)中详细了介绍了CURL抓取HTML数据的技术.采集数据处理也是爬虫技术中非常重要的部分.处理HTML数据可以用字符串查找,也可以利用正则表达式,但采用Dom处理是最高级的方法. ...
- 诡异的 未处理的IOErrorEvent 2035
今天游戏发布上线之后,总是随机的出现卡死. 换了个safari之后,看到抛了 IOErrorEvent. 问题是,我所有的Loader都加入了contentLoaderInfo监听.而抛出来的又没有堆 ...
- Redis服务器的启动过程分析
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文将通过分析代码来介绍Redis的 ...
- scp命令[转]
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- struts2学习笔记之七:Result类型
一:关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法 他们体现了策略模式,具体Result类型参见:struts-default ...
- fir.im Weekly - 做一款 App 需要考虑什么
开发 App 是一个痛并快乐的旅程.工具越来越多,成本也越来越低,那么在开发之前需要考虑些什么?limboy 总结了一些经验和反思--做一个 App 前需要考虑的几件事,参考一下为你的 App 多留点 ...
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- 处于同一个域中的两台Sql server 实例无法连接
处于同一个域中的两台Sql server 实例无法连接,报的错误信息如下: A network-related or instance-specific error occurred while es ...