前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Dapper读取Oracle多个结果集

使用Dapper读取Oracle多个结果集

作者头像
跟着阿笨一起玩NET
发布2022-05-10 13:59:15
1.1K0
发布2022-05-10 13:59:15
举报

Dapper对SQL Server支持很好,但对于Oracle有些用法不一样,需要自己进行特殊处理。

1、首先要自定义一个Oracle参数类

代码语言:javascript
复制
  public class OracleDynamicParameters : SqlMapper.IDynamicParameters
     {
         private readonly DynamicParameters dynamicParameters = new DynamicParameters();
 
         private readonly List<OracleParameter> oracleParameters = new List<OracleParameter>();
 
         public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction, object value = null, int? size = null)
         {
             OracleParameter oracleParameter;
             if (size.HasValue)
             {
                 oracleParameter = new OracleParameter(name, oracleDbType, size.Value, value, direction);
             }
             else
             {
                 oracleParameter = new OracleParameter(name, oracleDbType, value, direction);
             }
 
             oracleParameters.Add(oracleParameter);
         }
 
         public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction)
         {
             var oracleParameter = new OracleParameter(name, oracleDbType, direction);
             oracleParameters.Add(oracleParameter);
         }
 
         public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
         {
             ((SqlMapper.IDynamicParameters)dynamicParameters).AddParameters(command, identity);
 
             var oracleCommand = command as OracleCommand;
 
             if (oracleCommand != null)
             {
                 oracleCommand.Parameters.AddRange(oracleParameters.ToArray());
             }
         }
     }

2、对于一个sql语句中的多个结果集处理

代码语言:javascript
复制
 string sql = @"
begin
open :rslt1 for select * from t_um_event where rownum<10
and c_fid>:fid;

open :rslt2 for select count(*) as count from t_um_event;
end;
                    ";
                OracleDynamicParameters dynParams = new OracleDynamicParameters();


                dynParams.Add(":rslt1", OracleDbType.RefCursor, ParameterDirection.Output);
                dynParams.Add(":rslt2", OracleDbType.RefCursor, ParameterDirection.Output);
                dynParams.Add(":fid", OracleDbType.Int64, ParameterDirection.Input, 1000);
                using (var muti = cn.QueryMultiple(sql, param: dynParams))
                {
                    List<TestClass> firstRes = muti.Read<TestClass>().ToList();
                    RecordCount secondRes = muti.ReadFirstOrDefault<RecordCount>();
                }
代码语言:javascript
复制
    class TestClass
    {
        public string C_ID
        {
            get;
            set;
        }
        public DateTime? C_REG_TIME
        {
            get;
            set;
        }
        public string C_Title
        {
            get;
            set;
        }
    }

    class RecordCount
    {
        public int Count { get; set; }
    }

2、对于oracle存储过程的多个结果集处理,存储过程定义

代码语言:javascript
复制
create or replace package pkg_test_dapper is

  TYPE t_cursor IS REF CURSOR;

  procedure p_get_list(cur_out1 out t_cursor,
                       p_fid    int,
                       cur_out2 out t_cursor);
  procedure p_get_count(cur_out out t_cursor);
end pkg_test_dapper;
/
create or replace package body pkg_test_dapper is

  procedure p_get_list(cur_out1 out t_cursor,
                       p_fid    int,
                       cur_out2 out t_cursor) as
  begin
    open cur_out1 for
      select *
        from t_um_event
       where rownum < 10
         and c_fid > p_fid;
    open cur_out2 for
      select count(*) as count from t_um_event;
  end;
  procedure p_get_count(cur_out out t_cursor) as
  begin
    open cur_out for
      select count(*) as count from t_um_event;
  end;
end pkg_test_dapper;
/

c#中用dapper调用存储过程返回oracle多个结果集

代码语言:javascript
复制
   using (IDbConnection cn = new OracleConnection(ConfigurationManager.ConnectionStrings["ZWGCDB"].ConnectionString))
            {

                TestClass Evt = cn.QueryFirstOrDefault<TestClass>("select * from t_um_event where c_id=:Id", new { id = "1BA2BF30-658A-4A79-A179-05A77C527150" });

                //int cnt = cn.Execute("update t_um_event set c_reg_time=:reg_time where c_id=:id", new { id = "CEA00DA2-79D2-48CC-A9E1-D3CBB3842E54", reg_time = DateTime.Now });

              

                OracleDynamicParameters dynParams = new OracleDynamicParameters();

                dynParams.Add("cur_out1", OracleDbType.RefCursor, ParameterDirection.Output);
                dynParams.Add("cur_out2", OracleDbType.RefCursor, ParameterDirection.Output);
                dynParams.Add("p_fid", OracleDbType.Int64, ParameterDirection.Input, 1000);

                using (var muti = cn.QueryMultiple("pkg_test_dapper.p_get_list", dynParams, commandType: CommandType.StoredProcedure))
                {
                    List<TestClass> firstRes = muti.Read<TestClass>().ToList();
                    RecordCount secondRes = muti.ReadFirstOrDefault<RecordCount>();
                }
            }

参考:http://stackoverflow.com/questions/18772781/using-dapper-querymultiple-in-oracle

使用到的包文件如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Dapper" version="1.50.2" targetFramework="net40" />
  <package id="Oracle.ManagedDataAccess" version="12.1.24160419" targetFramework="net40" />
</packages>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档