一 前言

  实战踩坑系列,调用第三方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. Flink(五) —— DataStream API

    Source 从自定义的集合中读取数据 /** * 从集合中读取数据 */ def readDataFromCollection(): Unit = { val env = StreamExecuti ...

  2. 修改hosts文件不需要重启的方法

    显示DNS缓存内容: ipconfig /displaydns 更新DNS缓存内容: ipconfig /flushdns

  3. 关于mysql的符合主键的定义和解释

    DROP TABLE IF EXISTS `v9_vote_data`;CREATE TABLE `v9_vote_data` (  `userid` mediumint(8) unsigned DE ...

  4. 机器人可以拥有社交智能吗?——微软雷德蒙研究院院长Eric Horvitz与他的个人虚拟助理之梦

    Horvitz与他的个人虚拟助理之梦" title="机器人可以拥有社交智能吗?--微软雷德蒙研究院院长Eric Horvitz与他的个人虚拟助理之梦">编者按:到 ...

  5. Eclipse创建java web工程

    Eclipse创建java web工程 eclipse版本:eclipse-jee-4.5-win32-x64 tomcat版本:apache-tomcat-7.0.63-windows-x64 jd ...

  6. Xpath 入门教程

    准备xml 文档 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book ...

  7. CocoaPods 安装和使用 - darcy_tang 的博客

    最近换了新机器,重新搭建了开发环境,其中当然包括 CocoaPods. 装完顺便更新下 CocoaPods 安装文档. 正文 安装 CocoaPods 是用 ruby 实现的,要想使用它首先需要有 r ...

  8. 吴裕雄--天生自然HTML学习笔记:HTML 布局

    网页布局对改善网站的外观非常重要. 请慎重设计您的网页布局. <!DOCTYPE html> <html> <head>  <meta charset=&qu ...

  9. SpringBoot中Shiro使用Pac4j集成CAS认证

    SpringBoot中Shiro使用Pac4j集成CAS认证 Pac4j 简介 Pac4j与Shiro,Spring Security一样都是权限框架,并且提供了OAuth - SAML - CAS ...

  10. JAVA 获取网页源代码保存到本地文件

    package httpget; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundExce ...