.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 ...
随机推荐
- 54)PHP,访问修饰符
类外就是你再实例化成对象的时候 用你类里面的变量 继承的类内, 就是子类里面,但是实例化对象时,不能用 本类内, 只在本类的定义时用,子类不能用.
- SEERC 2018 Inversion
题意: 如果p数组中 下标i<j且pi>pj 那么点i j之间存在一条边 现在已经知道边,然后求p数组 在一张图中,求有多少个点集,使得这个点集里面的任意两点没有边 不在点集里面的点至少有 ...
- GSON转换成Long型变为科学计数法及时间格式转换异常的解决方案
直接上工具类了,简单实用 public class GsonUtils { private static Gson gson = null; static { if (gson == null) { ...
- LootCode-链表排序-Java
链表排序 0.来源 来源:力扣(LeetCode) 题目链接:https://leetcode-cn.com/problems/sort-list 1.题目描述 在 O(n log n) 时间复杂度和 ...
- WAIC | 奇点云携「酷炫AI应用」亮相2019世界人工智能大会
你是否还在疑惑“人工智能可否改变世界?” 那么,你该有一些危机感了. 机器视觉.自然语言处理.智能语音.机器人问诊.智慧驾驶……这些AI技术及应用早已渗入了我们日常生活的点滴. 29日,以「智联世界, ...
- django框架基础-ORM进阶-长期维护
############### ORM进阶---contenttype ################ 设计思路: """ 路飞有两种课,专题课和学位课, ...
- 吴裕雄--天生自然python学习笔记:Python uWSGI 安装配置
本文主要介绍如何部署简单的 WSGI 应用和常见的 Web 框架. 以 Ubuntu/Debian 为例,先安装依赖包: apt-get install build-essential python- ...
- [洛谷P4782] [模板] 2-SAT 问题
NOIp后第一篇题解. NOIp我考的很凉啊...... 题目传送门 之前讲过怎么判断2-SAT是否存在解. 至于如何构造一组解: 我们想到对tarjan缩点后的图进行拓扑排序. 那么对于代表0状态的 ...
- 初级string
标准库string类型 string对象初始化 string s1; string s2(s1); string s3("value"); string s4(n,'c'); st ...
- 吴裕雄--天生自然HTML学习笔记:HTML 文本格式化
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...