讲师中心 微信公众号
AI工具推荐 视频效率加速

c# 如何连接 oracle 数据库

胖宇同学_1169

胖宇同学_1169

发布时间:2025-12-30 12:30:09

|

1058人浏览过

|

来源于php中文网

原创

推荐使用 Oracle.ManagedDataAccess(非.Core版)连接Oracle数据库,它纯.NET实现、免客户端安装;注意区分.NET Framework与.NET Core/5+的包版本,连接字符串需正确配置,优先用using确保资源释放。

c# 如何连接 oracle 数据库

用 Oracle.ManagedDataAccess 连接 Oracle 数据库

推荐直接使用 Oracle.ManagedDataAccess(ODP.NET Managed Driver),它不依赖 Oracle 客户端安装,纯 .NET 实现,部署简单。NuGet 包名就是 Oracle.ManagedDataAccess,不是旧版的 System.Data.OracleClient(已弃用)或需要本地 Oracle Client 的 Oracle.DataAccess。

常见错误:项目里装了 Oracle.ManagedDataAccess.Core 却在 .NET Framework 项目中引用 —— 这会导致运行时报 Could not load file or assembly 'Oracle.ManagedDataAccess' 。注意区分:.Core 仅用于 .NET Core / .NET 5+;传统 .NET Framework 项目必须用非 .Core 版本。

  • 在 Visual Studio 中右键项目 → “管理 NuGet 包” → 搜索并安装 Oracle.ManagedDataAccess(无 .Core 后缀)
  • 连接字符串格式示例:"User Id=myuser;Password=mypass;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))"
  • 若使用 TNS 别名(如 ORCL),确保 tnsnames.ora 在应用可访问路径下,或改用 EZConnect 格式:"User Id=myuser;Password=mypass;Data Source=myhost:1521/orcl"

写一个最小可用的 OracleConnection 打开测试

别一上来就写 ORM 或封装类,先验证驱动和连接是否通。重点看 Open() 是否抛异常,以及异常类型 —— 大部分连不上都是连接字符串或网络问题,不是代码逻辑问题。

using Oracle.ManagedDataAccess.Client;
<p>string connStr = "User Id=scott;Password=tiger;Data Source=localhost:1521/orcl";
using (var conn = new OracleConnection(connStr))
{
try
{
conn.Open();
Console.WriteLine("✅ 连接成功,版本:" + conn.ServerVersion);
}
catch (OracleException ex)
{
Console.WriteLine("❌ Oracle 错误:" + ex.Number + " - " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("❌ 其他异常:" + ex.Message);
}
}

注意:OracleException 的 Number 字段很关键,比如 ORA-12154 是解析不到服务名,ORA-12541 是监听器没响应,ORA-01017 是用户名密码错 —— 这些数字比错误消息更可靠,适合日志分类。

Work Productivity Word Mail Workflow Helper
Work Productivity Word Mail Workflow Helper

构建并排查Microsoft Word邮件合并及DOCX模板工作流,使用合并域、内容控件、文档属性、重复区块、数据等

下载

执行查询时要注意参数命名和数据类型

Oracle 的参数前缀是冒号 :,不是 @ 或 ?,且**大小写敏感**。同时,OracleParameter 的 OracleDbType 显式指定类型比靠推断更稳,尤其对 CLOB、DATE、NUMBER 等易出错类型。

  • 参数名必须带冒号:cmd.Parameters.Add(new OracleParameter(":id", 123)),写成 "id" 或 "@id" 都会报 ORA-01036
  • 查询含中文或特殊字符时,确保数据库字符集(如 AL32UTF8)与客户端一致,否则 GetString() 可能乱码
  • OracleCommand.CommandTimeout 默认是 30 秒,长查询记得调大,否则超时后连接可能未释放

连接池默认开启,但要注意泄漏和状态残留

Oracle.ManagedDataAccess 默认启用连接池,这很好,但容易掩盖 Connection 忘记 Close() 或 Dispose() 的问题。连接池里的物理连接不会立刻关闭,而是回收复用 —— 表面看程序跑得动,实际可能耗尽池子(默认上限 100)。

典型症状:应用运行一段时间后,新请求卡住、超时,日志里反复出现 ORA-12519: no appropriate service handler found 或 Timeout expired。

  • 务必用 using 块包裹 OracleConnection 和 OracleCommand
  • 不要手动调用 ClearAllPools() 除非真有连接状态污染(如 ALTER SESSION),它会强制所有连接重连,伤性能
  • 可通过连接字符串加 Pooling=true;Min Pool Size=5;Max Pool Size=50; 控制池行为

最常被忽略的是连接字符串里混用了不同用户、不同服务名但共用同一个连接池键 —— ODP.NET 会把它们当同一池,导致权限或 schema 错乱。每个独立业务场景建议用唯一连接字符串,或显式关池:Pooling=false(仅调试用)。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3131

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

554

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

542

2026.02.12

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1926

2025.08.19

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2844

2023.09.04

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn