.Net Core调用oracle存储过程
一 前言
实战踩坑系列,调用第三方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存储过程的更多相关文章
- MyBatis调用Oracle存储过程
MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...
- Java调用oracle存储过程通过游标返回临时表数据
注:本文来源于 < Java调用oracle存储过程通过游标返回临时表数据 > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...
- C#调用Oracle存储过程
C#调用Oracle存储过程的代码如下所示: using System; using System.Collections.Generic; using System.Collections.Obje ...
- C#调用 oracle存储过程
C#调用oracle 存储过程与调用Sql server存储过程类似,比较简单:直接给出示例: /// <summary> /// 判断物料类型是不是总部管控 /// </summa ...
- 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- c#调用oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- C#调用Oracle存储过程的方法
C#调用Oracle存储过程的方法 准备: 环境:pl/sql+oracle9i+vs2008 创建表test: create table TEST( ID NUMBER,//编号 NA ...
- Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例
Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13| 分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...
- python调用oracle存储过程
oracle 存储过程 python调用oracle存储过程 -- 通过cx_Oracle连接 import cx_Oracle # 连接数据库 orcl_engine = 'scott/s123@x ...
随机推荐
- 统计一个字符串中"java"出现的次数
public class CountJava{ public static void main(String[] args){ String str = "dnajjavaNISLjavaE ...
- 八、linux-mysql的mysql主从复制原理和实战
1.mysql主从复制介绍 mysql支持单向.双向.链式级联.实时.异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其它服务器充当从服务器(Slave). 复制:单向同步 ...
- MTSP问题
问题描述:m个旅行商去旅游 n个城市,规定都必须从同一个出发点出发,而且返回原出发点,需要将所有的城市遍历完毕,每个城市只能游历一次,但是为了路径最短可以路过这个城市多次.这个就是多旅行商问题.是在T ...
- 401认证钓鱼demo
<?php //@b4dboy if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW'])) ...
- 系统学习javaweb3----HTML语言3(结束)
说明:昨天是北方小年,需要做的事情有点多,需要祭灶,扫尘.包饺子,吃糖瓜儿,学习时间有点少,所以今天将两天的知识综合一下发出. 自我感觉:虽然感觉大致都了解了HTML语言,但是感觉自己面对程序还是无从 ...
- OneDrive for Business
一.界面介绍 1.在Office 365主页 点击“OneDrive”登陆 2.进入OneDrive,可对文档进行存储.同步并共享文档. 3.点击,可对文档进行编辑.分享.重命名等操作 二.文档同步 ...
- SPI以及IIC的verilog实现以及两者之间的对比
一.SPI是一种常用的串行通信接口,与UART不同的地方在于.SPI可以同时挂多个从机,但是UART只能点对点的传输数据,此外SPI有四条线实现数据的传输,而UART采用的是2条实现串行数据的传输 1 ...
- mongo rename collection
db.getCollection('a').renameCollection("b"); db.getCollection('a').find({}, {_id: 0}).forE ...
- .net core 读取json文件
核心代码 Program.cs: using System; using System.IO; using Microsoft.Extensions.Configuration; namespace ...
- scala语言yield配合for的用法实例
yield配合for的用法 话不多说见实例 package com.donews.reynold /** * Created by reynold on 2017/3/23. */ object Sc ...