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

一、自定义函数的创建和调用 (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. 将Win8.1/WP8.1应用迁移到Universal Windows Platform

    在上一篇在VS2015 RC打开CTP中创建的工程,我们介绍了怎么在RC中打开CTP中创建的Universal 工程,这一篇我们来讲下怎么将Windows 8.1/WP8.1的应用迁移到Univers ...

  2. openwrt-智能路由器hack技术(1)---"DNS劫持"

    openwrt-智能路由器hack技术(1)---"DNS劫持" 1   导读 PS:之前写的一个文章,现在发现结构内容排版不是太好,导致阅读体验太差,影响传播和SEO,所以现在整 ...

  3. 一种另类的解决URL中文乱码问题--对中文进行加密、解密处理

    情景:在资源调度中,首先用户需要选择工作目标,然后跟据选择的工作目标不同而选择不同的账号和代理ip.处理过程如下:点击选择账号,在js中获取工作目标对工作目标进行两次编码(encodeURI(enco ...

  4. 如何在 IIS 上搭建 mercurial server

    mercurial server 对于代码管理工具,更多的人可能更熟悉 Git 一些(Git 太火了).其实另外一款分布式代码管理工具也被广泛的使用,它就是 mercurial.多人协作时,最好能够通 ...

  5. IOS Socket 01-网络协议基础知识

    1. 网络参考模型 OSI参考模型                                          TCP/IP参考模型 2. 七层简述 1)物理层:主要定义物理设备标准,如网线的接 ...

  6. 每天一个linux命令(53):route命令

    Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或 ...

  7. Java-继承,多态练习0922-03

    编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void ...

  8. [Spring框架]Spring 事务管理基础入门总结.

    前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一 ...

  9. C#并行编程-线程同步原语

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  10. fir.im Weekly - 如何做一个出色的程序员

    做一个出色的程序员,困难而高尚.本期 fir.im Weekly 精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和有意思有质量的线下活动~ How ...