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

一、自定义函数的创建和调用 (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的基本用法(二) - 存储过程/函数的更多相关文章

  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. 你眼中的async/await是什么样的?

    又到了周末的code review环节,这次code review发现了一个对async/await的理解问题.让我们直奔主题: var foodsSearch = new FoodSearchSer ...

  2. MySQL--使用xtrabackup进行备份还原

    使用rpm包安装xtrabackup ## 安装依赖包 yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl- ...

  3. Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

    概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 ...

  4. 统计第一个空字符前面的字符长度(java实现)

    举例来说:char buf[] = {'a','b','c','d','e','f','\0','x','y','z'}当输入N=10或20,期待输出是6:当输入N=3或5,期待输出是3或5. pac ...

  5. Smack Message扩展,添加自定义元素(标签)经验分享

    Smack框架对XMPP协议进行了封装,从而方便与Openfire即时通信服务器做交互.说白了,Smack框架可以通过对象构造符合XMPP协议的XML字符串,避免手动拼接字符串. XMPP协议基本XM ...

  6. statcounter统计的浏览器市场占有率

      Source: StatCounter Global Stats - Browser Market Share

  7. 常见标签的默认属性值及相互作用——关于CSS reset的思考

    在现在的网站设计中使用reset.css用重置整个站点的标签的CSS属性的做法很常见,但有时候我们已经为了reset而reset,我们经常看到这样的reset代码 div{ padding:0px; ...

  8. javascript_basic_04之节点、元素

    1.DOM:文档对象模型,Document Object Model: 2.BOM:浏览器对象模型,Browser Object Model: 3.DOM组成:核心DOM,XML DOM,HTML D ...

  9. angularjs学习曲线

    angularjs学习曲线 刚开始学Augular觉得开发应用需要有相当的编程基础. 不得不说这确实是一款了不起的开发框架,它要求开发人员设计低耦合和可维护的应用. 使用AngularJS 的复杂度就 ...

  10. java错误

    Workspace in use or cannot be created, choose a different one. 出现这种情况一般是workspace的配置文件中出现了.lock文件(wo ...