zoukankan      html  css  js  c++  java
  • 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 = 10 }).FirstOrDefault();  //90
    Console.WriteLine("Count = " + res); //Count = 90
    
    //方法二 : 直接用Query方法, 传入函数名, 参数, 但是注意要把CommondType设置为StoredProcedure
    //而且调用的时候, 是必须要有 Return参数的, 否则会报错
    var para = new  DynamicParameters();
    para.Add("@idIn", 20);
    para.Add("@res", 0, DbType.Int32, ParameterDirection.ReturnValue);
    var res1 = conn.Query("func_test", para, null, true, null, CommandType.StoredProcedure).FirstOrDefault();  //0
    Console.WriteLine("Query @res = " + para.Get<int>("@res"));  //Query @res = 80
    
    //方法三 : 使用Execute方法也是可以的, 要注意加一个返回参数
    var param = new DynamicParameters();
    param.Add("@idIn", 25);
    param.Add("@res", 0, DbType.Int32, ParameterDirection.ReturnValue);
    var res2 = conn.Execute("func_test", param, null, null, CommandType.StoredProcedure);  //0
    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 = 15 }).FirstOrDefault();  //85
    Console.WriteLine("res = " + res);  //res = 85
    
    //方法二
    var param = new DynamicParameters();
    param.Add("@idIn", 20);
    param.Add("@count", 0, 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); //0
    Console.WriteLine("Execute count = " + param.Get<object>("@count"));  //Execute count = 80

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

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

  • 相关阅读:
    NTKO Officecontrol在线Word编辑器的使用
    SQL数据类型解释
    经典SQL语句大全(网络资源共享)
    Ext.grid.GridPanel属性及方法等
    C#简易播放器(基于开源VLC)
    委托,是我委托你处理事件
    .NET面试必备(整理)
    SQL server 数据库连接方式分析
    FTP操作类的使用
    微信企业号平台开发之获取菜单,创建菜单和删除菜单
  • 原文地址:https://www.cnblogs.com/elvinle/p/6053064.html
Copyright © 2011-2022 走看看