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

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

  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());
}
}
}

OracleDynamicParameters

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

 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, );
using (var muti = cn.QueryMultiple(sql, param: dynParams))
{
List<TestClass> firstRes = muti.Read<TestClass>().ToList();
RecordCount secondRes = muti.ReadFirstOrDefault<RecordCount>();
}
    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存储过程的多个结果集处理,存储过程定义

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多个结果集

   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, ); 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

使用到的包文件如下:

<?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>

自:http://weiweictgu.cnblogs.com/

使用Dapper读取Oracle多个结果集的更多相关文章

  1. oracle 存储过程返回结果集 (转载)

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

  2. oracle 存储过程返回结果集

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

  3. sqoop将oracle数据导入hdfs集群

    使用sqoop将oracle数据导入hdfs集群 集群环境: hadoop1.0.0 hbase0.92.1 zookeeper3.4.3 hive0.8.1 sqoop-1.4.1-incubati ...

  4. Oracle Database常用补丁集Patch号及各版本PSU

    Oracle Database常用补丁集Patch号及各版本PSU------------------------------------------------------------------- ...

  5. Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据

    Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据 PRM 全称为ParnassusData Recovery Manager ,由 诗檀软 ...

  6. 如何让dapper支持oracle游标呢?

    Dapper是一个轻型的ORM类.它有啥优点.缺点相信很多朋友都知道了,园里也有很多朋友都有相关介绍,这里就不多废话. 如果玩过Oracle都知道,存储过程基本都是通过游标返回数据的,但是dapper ...

  7. oracle返回多结果集

    kavy 原文 oracle返回多结果集 Oracle存储过程: create or replace procedure P_Sel_TopCount2(in_top in number, out_c ...

  8. Dapper连接Oracle

    Dapper连接Oracle去年写过了篇博客,名字叫:让dapper支持Oracle 网址:http://www.cnblogs.com/ushou/archive/2012/09/28/270690 ...

  9. dapper支持oracle游标

    dapper支持oracle游标 Dapper是一个轻型的ORM类.它有啥优点.缺点相信很多朋友都知道了,园里也有很多朋友都有相关介绍,这里就不多废话. 如果玩过Oracle都知道,存储过程基本都是通 ...

随机推荐

  1. HTTP协议 (三) 压缩

    之前写过一个篇 [HTTP协议详解] ,这次继续介绍HTTP协议中的压缩. 本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这个工具,可以先参考[Fiddler教 ...

  2. Linux系统上通知网关更新arp

    经常会有在线更换Linux服务器IP的操作,该操作带来的一个问题是: 我们已经执行了修改IP的操作,但由于网络上(网关)的ARP缓存暂未更新,导致在某一段时间内,该服务器会有网络不通的情况存在. 因此 ...

  3. Sep19_html/css_imooc学习笔记_1

    1. <h1></h1>标题,h1-h6从大到小 2. <p></p> 段落 3. <img src=“1.jpg”> 加入图片 4.基本结 ...

  4. Xcode添加代码块

    1.在编辑区写好代码 @property (nonatomic, assign) <#type#> <#name#> 在Xcode中实际输入完成之后显示的是下面的样子: 2.全 ...

  5. Hadoop集群搭建安装过程(三)(图文详解---尽情点击!!!)

    Hadoop集群搭建安装过程(三)(图文详解---尽情点击!!!) 一.JDK的安装 安装位置都在同一位置(/usr/tools/jdk1.8.0_73) jdk的安装在克隆三台机器的时候可以提前安装 ...

  6. textarea关于空格和换行那点事

    textarea中空格连续输入多个的情况下,数据回显的时候页面只是显示一个:换行同样有问题,在textarea中有换行,在页面上却没有,今天终于看到个写的比较具体的文章,拿过来收藏下. 地址链接: h ...

  7. oracle信息统计

    优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...

  8. sql server 更新视图的sp

    create procedure RefreshAllViewas begin declare @ViewName varchar(250) declare #views cursor for sel ...

  9. ubuntu 配置vim(vimrc)

    打开终端:ctrl+alt+t 进入vim文件:cd /etc/vim 打开vimrc文件:sudo gedit vimrc 然后在行末if语句前加上下面的内容,"  这个符号为注释,后面内 ...

  10. TP中关于自定义类库的添加和使用

    ThinkPHP的类库主要包括公共类库和应用类库,都是基于命名空间进行定义和扩展的.只要按照规范定义,都可以实现自动加载. 类库存放位置:Think目录:系统核心类库Org目录:第三方公共类库demo ...