zoukankan      html  css  js  c++  java
  • .NET 使用EF执行存储过程你知道几种?

    前言

    我们在日常的开发过程中,会经常使用的复杂的SQL脚本需要执行,这个时候我们会考虑使用存储过程。

    那在.NET 开发环境下,我们如何使用EF如何调用存储过程呢?以下,是我工作期间,对EF调用存储过程的总结。

    EF 调用存储过程

    第一种:直接调用

    直接调用,需要在.demx文件中,选择"从数据库更新模型"选项,添加存储过程,然后,在程序中调用。

    调用无参数存储过程

    示列代码如下:

    using(var db=new 实体名称())
    {
       var result=db.ProcedureName().ToList();//调用
    }
    

    调用输入参数的存储过程

    示列代码如下:

    using(var db=new Entities())
    {
       SqlParameter[] para=new SqlParameter[1];//声明参数
       para[0]=new SqlParameter("@para1",paraval);//输入参数赋值
       var result=db.ProcedureName(para[0]).ToList();//调用
    }
    

    调用输入与输出参数的存储过程

    示列代码如下:

    using(var db=new Entities())
    {
        string outVal=string.Empty; //用于接收存储过程返回的参数
        int type=1;//输入参数
        ObjectParameter output = new ObjectParameter("OutParaKey", DBNull.Value);//输出参数
        var result=db.ProcedureName(type,output).ToList();//调用存储过程
        outVal=output.value.ToString();//接收输出参数的值
    }
    
    

    第二种:间接调用

    间接调用,就是直接使用EF的内置的Database.SqlQuery方法,执行存储过程SQL语句。

    调用无参数存储过程

    示列代码如下:

    using(var db=new Entities())
    {
        var result=db.Database.SqlQuery<Model>("exec ProcedureName").ToList(); //调用存储过程
    }
    
    

    调用输入参数的存储过程

    示列代码如下:

    using(var db=new Entities())
    {
        SqlParameter[] para = new SqlParameter[2];//声明参数
        para[0] = new SqlParameter("@paraKey", paraVal);//输入参数赋值
        var result=db.Database.SqlQuery<Model>("exec ProcedureName @paraKey",para).ToList();//调用存储过程
    }
    
    

    调用输入与输出的存储过程

    示列代码如下:

    using(var db=new Entities())
    {
        SqlParameter[] para = new SqlParameter[2];//声明参数
        para[0] = new SqlParameter("@paraKey1", paraVal1);//输入参数赋值
        para[1] = new SqlParameter("@paraKey2", paraVal2) //输出参数赋值
        {
           Direction = ParameterDirection.Output,  //指向输出参数的
           SqlDbType = SqlDbType.VarChar,          //输出参数类型
           Size = 200                              //输出参数大小
        };
        var result=db.Database.SqlQuery<Model>("exec ProcedureName @paraKey1,@paraKey2 output",para).ToList();//调用存储过程
    }
    

    总结

    对于直接调用和间接调用的方式,我个人更倾向使用间接的方式调用存储过程。

    因为,直接调用存储过程的方式使用麻烦起来十分麻烦(ps:个人觉得):

    首先,需要添加存储过程到实体中才能在程序中调用。

    其次,存储过程发生变化,就必须把原来的存储过程删除,再添加一次存储过程。(ps:是只有我无法在实体中更新到存储过程嘛?)

    最后,添加的过程相对慢。(ps:是只有我添加的存储过程的时候要很久嘛?)

    em.....我是觉得这过程就非常不友好。相比于间接调用的方式那简直舒坦到不要不要的~

  • 相关阅读:
    线性表的实现用通用方法实现线性表的初始化、求表长、插入元素、删除元素等
    用c++定义两个坐标点,计算两点间距离;进而计算线段的面积
    Java:学生信息的录入,各种排序,对文件的操作
    数组1 2 3 4 5 6 1(输入-1结束),奇数位的数逆序,偶数位数不变
    按层次遍历二叉树,用队列作为缓冲
    Chapter09"内核模式下的线程同步"之事件内核对象
    Chapter10“I/O设备的同步和异步”之打开和关闭设备
    CSDN博客积分系统
    探秘Java垃圾回收机制
    Chapter09“内核模式下的线程同步”之可等待的计时器内核对象
  • 原文地址:https://www.cnblogs.com/ZengJiaLin/p/15160496.html
Copyright © 2011-2022 走看看