一 前言

  实战踩坑系列,调用第三方Oracle存储,各种血泪史,现记录如下。

二 入坑

  首先,调用Oracle需要安装客户端驱动才行,但是在程序开发中下载客户端驱动是一个不明智的选择。于是,不管是微软,还是oracle,都提供了方便我们程序开发的插件(dll/nuget),如System.Data.Oracle,Oracle.ManagedDataAccess。下图搜索结果中Oracle.ManagedDataAccess.EntityFramework包含Oracle.ManagedDataAccess,适用于.net framework,如果你想要使用EF的话。因为这里是NetCore程序,所以我选择了Oracle.ManagedDataAccess.Core包。

  初始程序:

private static void Remote()
{
// 创建Oracle连接
var connString = "User Id=user;Password=password;Data Source=ip:port/service_name;"; // 存储过程名称
var storedProcName = "SetTemperatureData"; // 参数设置
IDataParameter[] parameters = new IDataParameter[];
parameters[] = new OracleParameter("@id", );
   parameters[1] = new OracleParameter("@date", DateTime.Now);
parameters[] = new OracleParameter("@result", OracleDbType.Decimal, ParameterDirection.Output); using (OracleConnection conn = new OracleConnection(connString))
using (OracleCommand command = BuildQueryCommand(conn, storedProcName, parameters))
{
try
{
conn.Open();
var isSuccess = command.ExecuteNonQuery();
var result = (int)command.Parameters["@result"];
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
} private static OracleCommand BuildQueryCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
{
OracleCommand command = new OracleCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcedure;
foreach (OracleParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
return command;
}

  运行程序报错:

  错误1:

    产生原因:对接方提供的链接是从库地址,只有读权限。

  错误2:

    产生原因:存储过程名称问题,缺少了表空间,大概的意思是test.SetTemperatureData。

  错误3:

    产生原因:入参格式问题,字符串类型和时间类型不统一导致。

  错误4:

    产生原因:(int)command.Parameters["@result"]不能直接转换,需要进行多次转换Convert.ToDecimal(((OracleDecimal)command.Parameters["@result"].Value).Value);

  错误5:

    产生原因:了解到第三方oracle采用的是分布式负载均衡的方式,提供了多个ip地址,那原有的链接方式就不适用了,需要采用tsname.oa的方式链接。

  错误6:若你由于粗心大意,也会有所收获

    产生原因:链接字符错误,请仔细检查

三 出坑

   简直是错误大全,哈哈!最后代码粘贴如下:

private static void Remote()
{
// 创建Oracle连接
var connString = "User ID=uer;Password=password;Data Source=test";
if (string.IsNullOrWhiteSpace(OracleConfiguration.OracleDataSources["test"]))
{
OracleConfiguration.OracleDataSources.Add("test",
"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=[ip1])(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=[ip2])" +
"(PORT=1521))(LOAD_BALANCE=yes))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=service_name))))");
} // 存储过程名称
var storedProcName = "test.StoredProcName"; // 参数设置
IDataParameter[] parameters = new IDataParameter[];
parameters[] = new OracleParameter("@id", );
parameters[] = new OracleParameter("@date", DateTime.Now);
parameters[] = new OracleParameter("@result", OracleDbType.Decimal, ParameterDirection.Output); using (OracleConnection conn = new OracleConnection(connString))
using (OracleCommand command = BuildQueryCommand(conn, storedProcName, parameters))
{
try
{
conn.Open();
var isSuccess = command.ExecuteNonQuery();
var result = Convert.ToDecimal(((OracleDecimal)command.Parameters["@result"].Value).Value);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}

.Net Core调用oracle存储过程的更多相关文章

  1. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  2. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  3. C#调用Oracle存储过程

    C#调用Oracle存储过程的代码如下所示: using System; using System.Collections.Generic; using System.Collections.Obje ...

  4. C#调用 oracle存储过程

    C#调用oracle 存储过程与调用Sql server存储过程类似,比较简单:直接给出示例: /// <summary> /// 判断物料类型是不是总部管控 /// </summa ...

  5. 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集

    c#调用oracle存储过程返回数据集 2008-12-20 10:59:57|  分类: net|字号 订阅   CREATE OR REPLACE PACKAGE pkg_tableTypeIS  ...

  6. c#调用oracle存储过程返回数据集

    c#调用oracle存储过程返回数据集 2008-12-20 10:59:57|  分类: net|字号 订阅   CREATE OR REPLACE PACKAGE pkg_tableTypeIS  ...

  7. C#调用Oracle存储过程的方法

    C#调用Oracle存储过程的方法 准备: 环境:pl/sql+oracle9i+vs2008 创建表test: create table TEST(  ID      NUMBER,//编号  NA ...

  8. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  9. python调用oracle存储过程

    oracle 存储过程 python调用oracle存储过程 -- 通过cx_Oracle连接 import cx_Oracle # 连接数据库 orcl_engine = 'scott/s123@x ...

随机推荐

  1. 场景实践篇二:Nginx作为缓存

    cd /etc/nginx/conf.d/ vim cache_test.conf

  2. [Algo] 26. Kth Smallest Number In Sorted Matrix

    Given a matrix of size N x M. For each row the elements are sorted in ascending order, and for each ...

  3. 概率DP——BZOJ4008 [HNOI2015]亚瑟王

    [HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 ...

  4. 信贷风控模型开发----模型流程&好坏样本定义

    第二章 模型开发流程&好坏样本定义 2.1模型开发流程 2.1.1 评分模型流程图 2.1.2流程图阐述 该小结提出了一些数据指标,如果不明白没有关系,往后的文章笔者会一个个地解释这些指标的含 ...

  5. gpio 的配置

    1.时钟使能 B引脚RCC时钟脉冲启动.|(或)表示只要第三个为1就行. 也可以写为RCC_APB2ENR  | = 0X0008; 2.配置GPIO的输出模式以及速度 3 . 如果是 0号引脚:GP ...

  6. FastDFS安装部署

    博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 服务器信息: Storage:192.168.247.20 Traker:192.168.247.21 一.搭建环境准备 ...

  7. 类加载器ClassLoader的理解

    最近在做一个热加载Class的小组件,这个组件需要对类加载器ClassLoader有所了解,我就顺便借这个机会把学到的一点皮毛与大家分享一下. 从Class文件开始 ClassLoader,顾名思义就 ...

  8. [LC] 165. Compare Version Numbers

    Compare two version numbers version1 and version2.If version1 > version2 return 1; if version1 &l ...

  9. Nginx笔记总结二十一:隐藏或者混淆nginx返回的Server信息

    [root@localhost nginx-]# vi src/http/ngx_http_header_filter_module.c 修改:49-50行 static char ngx_http_ ...

  10. 第十六届“二十一世纪的计算”学术研讨会 图灵奖获得者Butler W. Lampson主题演讲

    Personal Control of Digital Data 图灵奖获得者Butler W. Lampson主题演讲" title="第十六届"二十一世纪的计算&qu ...