全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c# 如何连接 oracle 数据库

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

用 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;

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); } }

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

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

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

  • 参数名必须带冒号: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 foundTimeout expired

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

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


# oracle  # word  # app  # access  # session  # oracle数据库  # c#  # 网络问题  # .net  # red  # 数据类型  # 封装  # date 


相关文章: 商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  如何在IIS7中新建站点?详细步骤解析  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何在腾讯云免费申请建站?  公司网站的制作公司,企业网站制作基本流程有哪些?  ,有什么在线背英语单词效率比较高的网站?  网站制作模板下载什么软件,ppt模板免费下载网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Android自定义listview布局实现上拉加载下拉刷新功能  高防服务器租用指南:配置选择与快速部署攻略  香港服务器租用费用高吗?如何避免常见误区?  如何获取免费开源的自助建站系统源码?  制作网站的软件免费下载,免费制作app哪个平台好?  宝塔建站助手安装配置与建站模板使用全流程解析  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  简单实现Android验证码  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何通过虚拟主机快速完成网站搭建?  建站主机服务器选型指南与性能优化方案解析  如何在Tomcat中配置并部署网站项目?  制作电商网页,电商供应链怎么做?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  设计网站制作公司有哪些,制作网页教程?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Android滚轮选择时间控件使用详解  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何基于云服务器快速搭建个人网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何通过主机屋免费建站教程十分钟搭建网站?  如何设置并定期更换建站之星安全管理员密码?  成都网站制作报价公司,成都工业用气开户费用?  建站之星安装步骤有哪些常见问题?  个人网站制作流程图片大全,个人网站如何注销?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何快速启动建站代理加盟业务?  高性价比服务器租赁——企业级配置与24小时运维服务  如何通过宝塔面板实现本地网站访问?  制作网站外包平台,自动化接单网站有哪些?  建站10G流量真的够用吗?如何应对访问高峰?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  建站之星展会模板:智能建站与自助搭建高效解决方案  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  完全自定义免费建站平台:主题模板在线生成一站式服务  为什么Go需要go mod文件_Go go mod文件作用说明  宝塔面板创建网站无法访问?如何快速排查修复?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。