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学习心 ...
随机推荐
- AMD加载器实现笔记(三)
上一篇文章中我们为config添加了baseUrl和packages的支持,那么这篇文章中将会看到对shim与paths的支持. 要添加shim与paths,第一要务当然是了解他们的语义与用法.先来看 ...
- 如何通过自定义注解实现AOP切点定义
面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...
- java提高篇(二四)-----HashSet
在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素. ...
- [ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)
上一节讲了16位定时器1,本节讲8位定时器3和定时器4! 1.综述 Timer 3 and Timer 4 are two 8-bit timers(8位定时器). Each timer has tw ...
- [转]在cocos2d-x中让一个项目适配iphone、iphone retina、ipad、ipad retina四种分辨率
http://cankeyyin.blog.163.com/blog/static/12336178320124149391202/ 原理:将iphone的hd图片给ipad用,即: 使用原iphon ...
- Knockout JS实现任务管理应用程序
1.1.1 摘要 在博文<Ember.js实现单页面应用程序>中,我们介绍了使用Ember JS实现一个单页应用程序 (SPA),这使我想起了几年前写过一个任务管理程序,通过选择日期,然后 ...
- Java连接Oracle数据库开发银行管理系统【二、设计篇】
一.总体分析 此系统的实现并不难,但是如何更好的设计出实现方式还是需要更深入的分析,例如:如果再增加其他功能,是不是需要变动的 代码很少,只是直接再增加一点功能就可以了呢?如果使用的不是Ora ...
- Java基础之打印万年历
今天刚开的博客,第一篇博文,一篇关于Java基础的内容,水平有限,多多见谅,希望和大家在学习编程的路上共同进步. 问题:输入年,月,打印对应年月的日历. 示例: ----------- ...
- Atitit blend mode COLOR_DODGE 混合模式 “颜色减淡”模式
Atitit blend mode COLOR_DODGE 混合模式 "颜色减淡"模式 1.1. 混合模式是图像处理技术中的一个技术名词1 1.2. 目录1 1.3. 颜色减淡C ...
- 一直都在说反射很有用 谈谈大型.NET ERP系统有哪些地方用到了反射
反射Reflection,MFC时代叫RTTI(Runtime Type Identification) 运行时类型识别,提供一种动态创建对象的能力. 这里不谈反射的概念和基本用法,仅仅就我遇到的ER ...