zoukankan      html  css  js  c++  java
  • 执行存储过程返回游标集合转换成List

      最近在项目中使用了Entity Framework 4.1,语句查询全部都是用Linq和Lambda表达式完成,但是有几个页面查询比较复杂,用到了多个条件汇总和列值的判断,如果用Linq来写语句相当复杂,还未必能实现想要的结果,最终只能选择Oracle的存储过程来完成,因为需要传入参数执行查询返回结果集。

      在使用EF调用执行存储过程获取游标集合,试验琢磨了几天也未能实现,最终只能采取.Net的客户端驱动或者OleDb连接Oracle实现存储过程的调用,最终获取到的集合也只能是DataSet或者DataTable,还必须要转换成实体对象List<>。

      存储过程执行方法:

    View Code
     1 /// <summary>  
     2         /// 执行存储过程  
     3         /// </summary>  
     4         /// <param name="storedProcName">存储过程名</param>  
     5         /// <param name="parameters">存储过程参数</param>  
     6         /// <param name="tableName">DataSet结果中的表名</param>  
     7         /// <returns>DataSet</returns>  
     8         public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
     9         {
    10             using (OracleConnection connection = new OracleConnection(connectionString))
    11             {
    12                 DataSet dataSet = new DataSet();
    13                 connection.Open();
    14                 OracleDataAdapter sqlDA = new OracleDataAdapter();
    15                 sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
    16                 sqlDA.Fill(dataSet, tableName);
    17                 connection.Close();
    18                 return dataSet;
    19             }
    20         }

      DataTable转换List方法:

    View Code
     1 class ConvertHelper<T> where T : new()  
     2     {  
     3         /// <summary>  
     4         /// 利用反射和泛型  
     5         /// </summary>  
     6         /// <param name="dt"></param>  
     7         /// <returns></returns>  
     8         public static List<T> ConvertToList(DataTable dt)  
     9         {  
    10   
    11             // 定义集合  
    12             List<T> ts = new List<T>();  
    13   
    14             // 获得此模型的类型  
    15             Type type = typeof(T);  
    16             //定义一个临时变量  
    17             string tempName = string.Empty;  
    18             //遍历DataTable中所有的数据行  
    19             foreach (DataRow dr in dt.Rows)  
    20             {  
    21                 T t = new T();  
    22                 // 获得此模型的公共属性  
    23                 PropertyInfo[] propertys = t.GetType().GetProperties();  
    24                 //遍历该对象的所有属性  
    25                 foreach (PropertyInfo pi in propertys)  
    26                 {  
    27                     tempName = pi.Name;//将属性名称赋值给临时变量  
    28                     //检查DataTable是否包含此列(列名==对象的属性名)    
    29                     if (dt.Columns.Contains(tempName))  
    30                     {  
    31                         // 判断此属性是否有Setter  
    32                         if (!pi.CanWrite) continue;//该属性不可写,直接跳出  
    33                         //取值  
    34                         object value = dr[tempName];  
    35                         //如果非空,则赋给对象的属性  
    36                         if (value != DBNull.Value)  
    37                             pi.SetValue(t, value, null);  
    38                     }  
    39                 }  
    40                 //对象添加到泛型集合中  
    41                 ts.Add(t);  
    42             }  
    43   
    44             return ts;  
    45   
    46         }  
    47     }  

      调用存储过程:

    View Code
     1 public List<V_TEST> selSum(string startDate,string endDate)
     2 {
     3     OracleParameter[] parms = {
     4                                   new OracleParameter("P_YBQJ_S",OracleType.VarChar,6),
     5                                   new OracleParameter("P_YBQJ_E",OracleType.VarChar,6),
     6                                   new OracleParameter("RESULT_CUR",OracleType.Cursor)
     7                               };
     8     parms[0].Value = startDate;
     9     parms[1].Value = endDate;
    10     parms[2].Direction = ParameterDirection.Output;
    11     DataSet DS = OraHelper.RunProcedure("PRO_LJHZ", parms, "DS");
    12     List<V_TEST> list1 = ConvertHelper<V_TEST>.ConvertToList(DS.Tables[0]);
    13     return list1;
    14 }

    有没有高手知道EF调用存储过程的方法,在此指导一下!

    欢迎各路高手在此留下脚印,共同探讨与分享~~~

  • 相关阅读:
    【FastDFS】FastDFS 分布式文件系统的安装与使用,看这一篇就够了!!
    【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!
    【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!
    【Spring注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!
    【Spring注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!
    【Spring注解驱动开发】关于BeanPostProcessor后置处理器,你了解多少?
    【Spring注解驱动开发】@PostConstruct与@PreDestroy源码的执行过程
    138 张图带你 MySQL 入门
    操作系统 I/O 全流程详解
    关于问问题和时间管理的感悟
  • 原文地址:https://www.cnblogs.com/ZHF/p/2599325.html
Copyright © 2011-2022 走看看