
简介本资源为Delphi与CBuilder开发者准备的ODACOracle Data Access ComponentsOracle连接控件组件库面向需要在Windows桌面应用中高效访问Oracle数据库的中高级开发者。ODAC由Devart开发核心组件TOracleConnection负责建立与管理物理连接并支持连接池配套的TOracleQuery、TOracleTable、TOracleTransaction、TOracleProcedure与TOracleFunction可覆盖查询、数据表操作、事务控制及存储过程调用同时兼容VCL与FireMonkey数据绑定、异步执行和LOB、RAC、物化视图等Oracle特性。压缩包共1807个文件约9.7MB以pas源码、dcu编译单元、dfm窗体、dpk与bpl包文件为主另含dpr、cpp、sql、bat等示例与构建脚本便于直接编译集成。目前已有467人学习下载适合希望减少底层API依赖、快速搭建Oracle数据访问层的开发者参考使用。1. 从一次连接超时说起Delphi ODAC 控件到底该怎么装上周帮一个做 ERP 的老哥排查问题他的 Delphi 程序连 Oracle 一直报 ORA-12170 超时折腾了一下午最后发现是 ODAC 版本和 Oracle 客户端位数对不上。这种坑我见过太多次了。Delphi 连 Oracle绕不开 ODAC 这套控件它比 BDE 稳定、比 dbExpress 省心但安装配置环节的坑一点不少。这篇文章面向的是正在用 Delphi 开发、需要连 Oracle 数据库的开发者不管你是刚接触 ODAC 的新手还是想从旧版本迁移的老手下面这套安装流程和参数配置都能直接抄作业。我会把版本选择、环境准备、安装步骤、参数配置、验证方法、常见报错处理全部走一遍尽量让你少走弯路。2. 装之前先把环境理清楚ODAC 版本与 Delphi 的对应关系2.1 确认你的 Delphi 版本和 ODAC 版本匹配ODAC 不是装一个版本就能通吃所有 Delphi 的。Devart 官方对每个 Delphi 版本都有对应的 ODAC 安装包装错了要么装不上要么装上了 IDE 里看不到控件面板。我一般会先确认三件事Delphi 的具体版本号比如 Delphi 10.4 Sydney、Delphi 11 Alexandria、操作系统是 32 位还是 64 位、Oracle 客户端装的是哪个版本。下面这张表是我整理过的常见对应关系方便你快速定位Delphi 版本推荐 ODAC 版本对应 Oracle 客户端Delphi 7ODAC 9.xOracle 11g 32位Delphi 2007ODAC 10.xOracle 11g 32位Delphi XE2ODAC 10.xOracle 11g/12c 32位Delphi 10.2 TokyoODAC 11.xOracle 12c 32位/64位Delphi 10.4 SydneyODAC 12.xOracle 19c 32位/64位Delphi 11 AlexandriaODAC 12.xOracle 19c/21c 32位/64位注意Delphi 7 到 Delphi 2007 之间跨度很大ODAC 9.x 和 10.x 的安装方式也有区别老版本 Delphi 建议用 ODAC 9.x 的最后一个稳定版。2.2 检查 Oracle 客户端是否就绪ODAC 本身不包含 Oracle 客户端它依赖你机器上已经装好的 Oracle Instant Client 或者完整版客户端。我一般会先检查这几个点第一看PATH环境变量里有没有 Oracle 客户端的bin目录。没有的话ODAC 运行时会找不到oci.dll直接报「无法加载 OCI 动态库」。第二确认TNS_ADMIN环境变量指向的目录下有tnsnames.ora文件。这个文件里配置了数据库的连接描述符ODAC 靠它来解析连接字符串。第三如果你用的是 64 位 DelphiOracle 客户端也必须是 64 位32 位 Delphi 配 32 位客户端。混用必翻车这是血泪经验。# 检查 PATH 中是否包含 Oracle 客户端路径 echo %PATH% | findstr /i oracle # 检查 TNS_ADMIN 是否设置 echo %TNS_ADMIN% # 查看 tnsnames.ora 内容示例 type %TNS_ADMIN%\tnsnames.ora上面这几条命令在 Windows 命令行里执行能快速确认环境变量和配置文件是否到位。PATH里没有 Oracle 路径的话手动把instantclient_19_xx目录加进去重启命令行再试。2.3 下载 ODAC 安装包的注意事项ODAC 的安装包分两种一种是带源码的完整版一种是不带源码的编译版。如果你只是用控件不带源码的版本就够了体积小、安装快。但如果你需要调试进 ODAC 内部或者要改它的源码适配特殊需求那就得下完整版。下载的时候注意看安装包文件名里的版本号和 Delphi 版本标识。比如odac1200d24pro.exe这种命名1200是 ODAC 版本d24代表 Delphi 10.4。下错了装不上别问我是怎么知道的。3. 安装 ODAC 控件从运行安装程序到 IDE 里看到控件面板3.1 运行安装程序并选择正确的 Delphi 版本双击安装包之后第一步是选 Delphi 版本。这里有个细节如果你机器上装了多个 Delphi 版本安装程序会全部列出来你只需要勾选你要用的那个。勾多了会往每个 IDE 里都注册一遍控件启动速度会变慢。安装路径我一般不改默认装在C:\Program Files (x86)\Devart\ODAC for Delphi XXXX下面。改路径的话后面配置 Library Path 的时候容易忘反而麻烦。安装过程中会问你要不要装 Demo 项目建议勾上。Demo 里有现成的连接示例后面验证的时候可以直接拿来改。3.2 配置 Delphi 的 Library Path装完之后Delphi 的 Library Path 里必须加上 ODAC 的Lib和Bin目录否则编译的时候找不到单元文件。具体路径取决于你的 Delphi 版本和 ODAC 安装位置一般是C:\Program Files (x86)\Devart\ODAC for Delphi 11\Lib C:\Program Files (x86)\Devart\ODAC for Delphi 11\Bin在 Delphi 里依次点Tools→Options→Language→Delphi→Library在Library Path里把上面两个路径加进去。加完之后点OK保存重启 Delphi 让配置生效。// 在 uses 里加上 ODAC 的单元 uses Ora, OraCall, OraError, DBAccess, MemDS; // 一个最简单的连接示例 procedure TForm1.ConnectOracle; var OraSession: TOraSession; begin OraSession : TOraSession.Create(nil); try OraSession.Server : 192.168.1.100:1521/orcl; OraSession.Username : scott; OraSession.Password : tiger; OraSession.Connect; ShowMessage(连接成功); except on E: Exception do ShowMessage(连接失败 E.Message); end; end;上面这段代码是最基础的连接测试。Server属性支持两种写法一种是IP:端口/服务名另一种是直接用tnsnames.ora里配置的别名。Username和Password就是数据库账号密码。Connect方法会实际发起连接如果失败会抛异常用try...except捕获一下就能看到具体错误。3.3 注册控件到 IDE 面板有些 ODAC 版本安装完之后不会自动把控件注册到 IDE 的控件面板上需要手动操作。打开 Delphi点Component→Install Packages然后Add找到 ODAC 安装目录下的.bpl文件比如OdacVcl.bpl或者dclodac.bpl加进去之后点OK。注册成功后在 IDE 的控件面板上应该能看到ODAC或者Devart标签页里面有一堆TOraSession、TOraQuery、TOraTable之类的控件。拖一个到 Form 上如果能正常显示说明安装没问题。提示如果控件面板里找不到 ODAC 标签先检查.bpl文件有没有加对再检查 Delphi 是不是以管理员权限运行的。权限不够的话注册会静默失败。4. 配置连接参数Server、Username、Password 和 Pooling 怎么填4.1 连接字符串的三种写法ODAC 的Server属性支持三种写法我一般根据场景选第一种是IP:端口/服务名比如192.168.1.100:1521/orcl。这种写法最直接不需要配tnsnames.ora适合临时连测试库。第二种是tnsnames.ora里的别名比如ORCL。这种写法需要TNS_ADMIN指向的目录下有对应的配置适合正式环境换库的时候只改配置文件就行。第三种是完整连接描述符比如(DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOST192.168.1.100)(PORT1521))(CONNECT_DATA(SERVICE_NAMEorcl)))。这种写法最灵活但写起来最长一般用在程序动态拼接连接串的场景。// 写法一IP 端口 服务名 OraSession.Server : 192.168.1.100:1521/orcl; // 写法二tnsnames.ora 别名 OraSession.Server : ORCL; // 写法三完整描述符 OraSession.Server : (DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOST192.168.1.100)(PORT1521))(CONNECT_DATA(SERVICE_NAMEorcl)));三种写法效果一样选哪种看你的部署习惯。我一般正式环境用别名测试环境用 IP 直连省得改配置文件。4.2 连接池参数怎么调ODAC 自带连接池TOraSession的Pooling属性设为True就开启了。连接池能显著减少频繁建立连接的开销但参数配不好反而会出问题。关键参数有两个Pooling和MaxPoolSize。Pooling控制是否启用连接池MaxPoolSize控制池里最多保持多少个连接。我一般把MaxPoolSize设成 10 到 20 之间具体看并发量。设太大了浪费数据库资源设太小了并发一高就排队。OraSession.Options.Pooling : True; OraSession.Options.MaxPoolSize : 15; OraSession.Options.ConnectionTimeout : 30;ConnectionTimeout是连接超时时间单位秒。网络不稳定的时候可以适当调大但别超过 60 秒不然用户等太久会以为程序卡死了。4.3 字符集和日期格式的坑Oracle 的字符集和 Delphi 的字符串编码有时候会对不上导致中文乱码。我一般会在连接之后先执行一条ALTER SESSION语句把日期格式和字符集显式设一下OraSession.ExecSQL(ALTER SESSION SET NLS_DATE_FORMAT YYYY-MM-DD HH24:MI:SS); OraSession.ExecSQL(ALTER SESSION SET NLS_LANGUAGE SIMPLIFIED CHINESE);日期格式不设的话Oracle 默认是DD-MON-RRDelphi 里用TDateTime字段的时候会解析出错。字符集的问题更隐蔽有时候查询出来是乱码有时候插入进去是乱码统一设一下能省很多排查时间。5. 避坑与排查ODAC 安装配置中最容易翻车的五个点5.1 报「无法加载 OCI 动态库」现象程序启动或者连接的时候弹窗报错提示找不到oci.dll或者加载失败。原因Oracle 客户端的bin目录不在PATH里或者位数不匹配。32 位程序加载 64 位oci.dll必失败反过来也一样。解决确认 Delphi 编译目标位数和 Oracle 客户端位数一致然后把客户端bin目录加到系统PATH的最前面重启 Delphi 再试。5.2 安装完 IDE 里看不到 ODAC 控件现象装完 ODAC打开 Delphi 发现控件面板上没有 ODAC 标签页。原因安装程序没有自动注册.bpl或者注册的时候 Delphi 没有以管理员权限运行。解决手动Component→Install Packages→Add找到 ODAC 目录下的dclodac*.bpl加进去。加的时候注意选对版本Delphi 11 和 Delphi 10.4 的.bpl不通用。5.3 连接超时但网络是通的现象ping数据库服务器能通telnet端口也通但 ODAC 连接就是超时。原因tnsnames.ora里配的SERVICE_NAME和数据库实际的服务名不一致或者TNS_ADMIN指向了错误的目录。解决用tnsping命令测试一下别名能不能解析不能解析就检查tnsnames.ora的路径和内容。tnsping通了但 ODAC 还超时的话检查一下Server属性是不是写成了SID而不是SERVICE_NAME。5.4 查询中文显示乱码现象数据库里存的中文用 ODAC 查出来是问号或者乱码。原因客户端字符集和数据库字符集不一致或者 Delphi 的TStringField编码设置不对。解决在连接之后执行ALTER SESSION SET NLS_LANGUAGE和NLS_TERRITORY把客户端环境设成和数据库一致。Delphi 这边检查一下TOraQuery的Options.CharSet属性设成csUTF8或者跟数据库一致的字符集。5.5 连接池耗尽导致程序卡死现象程序运行一段时间后所有数据库操作都卡住重启程序才能恢复。原因连接池里的连接没有正确释放TOraQuery用完没Close或者TOraSession没Disconnect。解决确保每个TOraQuery用完都Close每个TOraSession在程序退出或者模块卸载的时候Disconnect。连接池的MaxPoolSize别设太大设成实际并发量的 1.5 倍左右就够了。6. 装完怎么验证一个最小可跑的连接测试装完 ODAC、配好环境之后别急着往项目里集成先跑一个最小测试确认整条链路是通的。我一般会新建一个空白 VCL 项目拖一个TOraSession、一个TOraQuery、一个TDataSource、一个TDBGrid然后写下面这段代码procedure TForm1.FormCreate(Sender: TObject); begin OraSession.Server : 192.168.1.100:1521/orcl; OraSession.Username : scott; OraSession.Password : tiger; OraSession.Options.Pooling : True; OraSession.Options.MaxPoolSize : 10; try OraSession.Connect; OraQuery.Session : OraSession; OraQuery.SQL.Text : SELECT * FROM EMP WHERE ROWNUM 10; OraQuery.Open; DataSource.DataSet : OraQuery; DBGrid.DataSource : DataSource; Caption : 连接成功共 IntToStr(OraQuery.RecordCount) 条记录; except on E: Exception do Caption : 连接失败 E.Message; end; end;这段代码做了几件事设置连接参数、开启连接池、连接数据库、执行一条查询、把结果绑定到DBGrid上显示。如果窗体标题显示「连接成功共 10 条记录」说明 ODAC 安装、Oracle 客户端配置、连接参数、查询执行整条链路都没问题。如果报错根据错误信息对照第 5 章的排查清单逐条检查。我一般会先看oci.dll加载有没有问题再看tnsnames.ora解析对不对最后看账号密码和服务名。验证通过之后还有一个小技巧把TOraSession的Options.Direct属性设为True试试能不能绕过 Oracle 客户端直连。ODAC 的直接模式不需要装 Oracle 客户端部署的时候能省不少事。但直接模式对某些 Oracle 特性支持不全正式环境用之前先确认一下你的功能有没有踩到限制。从那以后我每次装完 ODAC都会先跑一遍这个最小测试确认没问题再往项目里集成。希望帮到你。本文还有配套的精品资源点击获取