简介ODAC1120320_x64.zip 是 Oracle 官方数据访问组件在 64 位 Windows 平台上的完整安装包面向使用 .NET 与 ASP.NET 4 开发、需要连接 Oracle 11g 数据库的程序员与运维人员。它解决了 64 位环境下缺少匹配驱动、部署 Instant Client 繁琐的问题让应用能通过 ADO.NET 接口高效执行查询与事务。压缩包共 194 个文件约 54.16MB以 90 个 dll 动态库为核心辅以 42 个 sql 脚本、17 个 plb 与 12 个 sym 符号文件另有 exe 安装程序、config 策略配置、bat 批处理及少量 jar、htm 文档覆盖驱动、客户端与配置全链路。其中 Instant Client 提供轻量级连接能力批处理脚本可自动完成安装、卸载与配置readme 文档则给出排错参考。目前已有 1116 人学习下载适合需要快速搭建 Oracle 数据访问环境、研究 ODP.NET 与 ORAMTS 事务复制机制的开发者参考。1. 为什么一个 64 位 Oracle 数据访问组件压缩包能让老项目少加三天班接手一个维护了七八年的 ASP.NET 老系统时最怕看到的不是业务逻辑乱而是某天早上打开解决方案发现引用列表里那个 Oracle.DataAccess 图标上多了个黄色感叹号。项目是 64 位的服务器上装的是 64 位 Oracle 客户端但开发机上随手装的却是 32 位驱动于是「在本机跑得好好的一发布就报架构不匹配」这种玄学问题就来了。ODAC1120320_x64.zip 这个包本质上就是 Oracle 官方那套 64 位数据访问组件Oracle Data Access Components的离线压缩包版本号里的 1120320 对应的是 11.2.0.3.20 这一支。它解决的核心问题很具体让 64 位 .NET 应用在不依赖完整 Oracle 客户端安装的前提下拿到能用的 Oracle.DataAccess.dll、Oracle.ManagedDataAccess.dll 以及配套的 SQL*Plus、ODP.NET 等工具。适合谁适合那些还在维护 .NET Framework 老项目、需要连 Oracle 11g/12c、又不想在每台机器上跑一遍臃肿安装程序的人。下面我就按「包里有什么 → 怎么挑文件 → 怎么配 → 怎么排错」的顺序把这个包拆开讲一遍。2. 拆包先看目录ODAC 压缩包里到底哪些文件值得留2.1 解压后的目录结构与核心 DLL 定位把 ODAC1120320_x64.zip 解压到一个短路径下比如D:\odac\不要放在中文目录或带空格的路径里后面注册 DLL 时会省很多事。解压完你会看到类似这样的结构D:\odac\ ├── oci\ │ └── dll\ │ ├── Oracle.DataAccess.dll │ ├── Oracle.ManagedDataAccess.dll │ └── ... ├── odp.net\ │ ├── bin\ │ │ ├── 2.x\ │ │ └── 4\ │ └── ... ├── sqlplus\ ├── instantclient\ └── install\这里最容易翻车的地方是很多人直接把整个oci\dll目录拷到项目 bin 下结果运行时提示找不到oraociei11.dll。原因是 Oracle.DataAccess.dll 是托管封装它底层还要调非托管的 OCI 动态库。所以正确的做法是分两步走——托管 DLL 进项目引用非托管 DLL 进输出目录或系统 PATH。我一般会先把这几个文件单独拎出来文件作用是否必须Oracle.DataAccess.dll非托管 ODP.NET 托管封装老项目引用它Oracle.ManagedDataAccess.dll纯托管驱动无需装客户端新项目优先oraociei11.dllOCI 非托管核心库用非托管版时必须有Oracle.ManagedDataAccess.EntityFramework.dllEF 支持用 EF 才需要提示如果你能用 Oracle.ManagedDataAccess.dll就尽量用它。纯托管意味着不用配 PATH、不用管 32/64 位部署时少一大半事。只有老代码里写死了Oracle.DataAccess.Client命名空间才需要走非托管那条路。2.2 托管版与非托管版的选择依据选哪个不是看心情是看你的项目约束。判断逻辑很简单项目里using Oracle.DataAccess.Client;且短期内不想改代码 → 用非托管版配 OCI。项目可以改命名空间或者新写数据访问层 → 用Oracle.ManagedDataAccess.Client纯托管。需要用到 OracleBulkCopy、OracleDataAdapter 的高级特性 → 两个版本都支持但托管版在 11.2.0.3 这一支里部分特性有差异得实测。非托管版的连接字符串长这样Data Source(DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOST10.0.0.5)(PORT1521))(CONNECT_DATA(SERVICE_NAMEORCL)));User Idappuser;Password****;托管版的连接字符串可以简化成Data Source10.0.0.5:1521/ORCL;User Idappuser;Password****;托管版不需要tnsnames.ora直接写 host:port/service 就行这是它最舒服的地方。非托管版则依赖 TNS 配置或者完整描述符配错了就是ORA-12154: TNS:could not resolve the connect identifier specified。3. 把 DLL 接进项目引用、拷贝、PATH 三步不能少3.1 在 Visual Studio 里正确添加引用假设你走的是非托管路线项目是 .NET Framework 4.x、目标平台 x64。步骤右键项目 → 添加引用 → 浏览 → 选中D:\odac\odp.net\bin\4\Oracle.DataAccess.dll。选中引用后在属性面板把「复制本地」设为 True。把oraociei11.dll、oraons.dll等非托管库拷到项目输出目录bin\Debug、bin\Release。第 3 步很多人漏掉结果本机因为装过客户端能跑一到干净服务器就崩。为了不每次手动拷可以在项目文件里加一个生成后事件xcopy /Y /I D:\odac\oci\dll\oraociei11.dll $(TargetDir) xcopy /Y /I D:\odac\oci\dll\oraons.dll $(TargetDir)逻辑说明$(TargetDir)是 VS 的生成输出目录宏xcopy 的/Y表示覆盖不提示/I表示目标被当作目录。这样每次生成都会把非托管库带过去省得发布时才发现缺文件。参数上要注意如果你项目是 Any CPU 且勾了「首选 32 位」那这个 64 位包里的 DLL 会直接报BadImageFormatException。必须把目标平台明确设成 x64。3.2 配置 PATH 与 TNS_ADMIN 的取舍非托管版找 OCI 库的顺序是先看应用目录再看 PATH。所以你有两个选择方案 A把非托管 DLL 全拷到应用目录不依赖 PATH。适合绿色部署。方案 B把D:\odac\oci\dll加进系统 PATH应用目录只放托管 DLL。适合机器上多个应用共用一套 ODAC。方案 B 加 PATH 的命令管理员权限setx /M PATH %PATH%;D:\odac\oci\dll注意setx有 1024 字符截断的老问题PATH 已经很长时别用它去系统属性里手动加更稳。TNS_ADMIN 则指向放tnsnames.ora的目录setx /M TNS_ADMIN D:\odac\network\admin如果你用托管版这两个环境变量都可以不配连接串直接写完整地址即可。这也是我推荐新项目用托管版的原因——少一层配置就少一类故障。3.3 用一段最小代码验证连通性配完别急着跑业务先写个最小验证using Oracle.ManagedDataAccess.Client; using System; class Program { static void Main() { // 托管版连接串直接写 host:port/service string connStr Data Source10.0.0.5:1521/ORCL;User Idappuser;Password****;; using (var conn new OracleConnection(connStr)) { try { conn.Open(); using (var cmd conn.CreateCommand()) { cmd.CommandText SELECT banner FROM v$version WHERE ROWNUM 1; Console.WriteLine(cmd.ExecuteScalar()); } } catch (OracleException ex) { // 把 ORA 错误码打出来排错全靠它 Console.WriteLine($ORA-{ex.Number}: {ex.Message}); } } } }逻辑说明这段代码只做一件事——打开连接并查版本。OracleException.Number会给出 ORA 错误码比看堆栈快得多。参数上Data Source的格式在托管版里是host:port/service_name非托管版则要换成完整描述符或 TNS 别名。跑通这一步说明驱动和网络都没问题再去接业务代码。4. 避坑与排查ODAC 部署里最常见的五类翻车4.1 现象BadImageFormatException提示「试图加载格式不正确的程序」原因项目目标平台和 DLL 位数不匹配。这个包是 64 位的但项目可能设成了 x86 或 Any CPU 且勾了 32 位首选。解决项目属性 → 生成 → 目标平台改成 x64如果是 Web 项目还要在 IIS 应用池里把「启用 32 位应用程序」设为 False。两边必须一致只改一边照样报。4.2 现象ORA-12154 TNS 无法解析连接标识符原因非托管版找不到tnsnames.ora或者 TNS_ADMIN 指向的目录里没有对应别名。解决确认TNS_ADMIN环境变量指向的目录下确实有tnsnames.ora且里面的别名和连接串里写的一致。改完环境变量要重启 VS 或 IIS否则进程读的还是旧值。托管版一般不会遇到这个因为它不走 TNS。4.3 现象本机正常服务器报「找不到 oraociei11.dll」原因非托管库没跟着发布包走服务器上也没装 Oracle 客户端。解决把oraociei11.dll、oraons.dll、oraociei11.dll等一并放进应用输出目录或者用生成后事件自动拷贝。别指望服务器上「碰巧」装过客户端。4.4 现象连接池耗尽报「ORA-00018 maximum number of sessions exceeded」原因代码里开了连接没关或者连接字符串里没限制池大小高并发下把会话数打满。解决所有 OracleConnection 用 using 包起来连接字符串里加Max Pool Size50;Min Pool Size5;控制池规模。托管版和本文还有配套的精品资源点击获取