尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

UniDAC 8.3.1源码版在Delphi中的安装配置与源码解析

UniDAC 8.3.1源码版在Delphi中的安装配置与源码解析 简介这是一份 unidac 8.3.1 源码版资源专为 Delphi / CBuilder 开发者设计支持 D7 至 XE10.4.1 等多个编译环境可连接 Oracle、SQL Server、MySQL、InterBase 和 Firebird是跨数据库桌面应用与服务端开发的常用组件。资源包共 2000 个文件以 dpk/dproj 工程文件、pas 源码、dfm 窗体定义、cfg 配置和 res 资源文件为主体附带 bmp 图标及帮助文档压缩后约 27.44MB。已有 648 人学习下载。源码版便于用户自行编译安装也可通过阅读源码深入理解 UniDAC 的引擎架构与数据库访问实现方便针对特定数据库或版本进行定制维护解决旧版 Delphi 上的控件兼容问题。包内还提供大量 bat 构建脚本和 bdsproj 工程文件可在不同 Delphi 版本间快速搭建编译环境同时借助示例工程验证控件功能。1. 项目概述这个源码包到底是什么为什么值得折腾最近在整理开发环境顺手把unidac_8.3.1_src这个源码版组件包重新部署了一遍。UniDAC 是 Devart 出品的通用数据访问组件在 Delphi 和 CBuilder 圈子里用得非常广核心价值一句话就能说清楚一套代码连接所有主流数据库。你不需要为 Oracle 装一套连接库、为 MySQL 再装一套UniDAC 把 ODBC、ADO、dbExpress 这些底层差异全部封装掉了代码层面只面对 TUniConnection 一个统一入口。这次拿到的是src源码版跟安装版二进制版可不是一回事。源码版意味着你看到的是完整的 Delphi 源文件而不是编译好的 BPL 包和 DCU 文件。整个包解压后大概是几十个.pas单位文件按数据库 Provider 目录组织。安装版双击 next 一路确认就行源码版需要你自己在 IDE 里配置库路径、编译运行时包、安装设计时包一条龙走完才能正常使用。那什么人需要折腾源码版我需要但我建议你也评估一下自己的场景。如果你的项目只是写业务逻辑、用到的数据库类型已经固定装个官方安装包就够了但如果你要跟踪调试 UniDAC 内部实现比如排查连接池泄漏、自定义数据库类型映射、修改连接握手细节源码版是唯一的路。另外团队里做统一封装组件的人基本也会选源码版因为可以把关键部分改一版内部的再分发给组员。这个包解决了什么问题省掉了项目里同时引用 Oracle Client、SQL Server Native Client、MySQL Client 等多套本地依赖库的噩梦。更重要的是源码版解决了黑盒依赖的焦虑——出问题时你能打开 DBAccess.pas 一步步跟踪连接流程而不是对着错误码瞎猜。2. 拿到源码包后先理清目录结构和版本信息再动手解压后别急着往 IDE 里塞先花十分钟把目录摸清楚。这一步做不好后面编译报错的时候你会绕很大圈子。2.1 源码包典型目录布局与单元文件命名规律unidac_8.3.1_src解压后根目录下通常会有Source、Demos、Docs等子目录。Source下面才是核心DAC目录放通用数据访问框架UniDAC目录放统一连接与数据集抽象层还有Oracle、SQLServer、MySQL、PostgreSQL、SQLite、InterBase、DB2、ODBC、ADO等按 Provider 命名的子目录。每个 Provider 目录下都有对应该数据库的实现单元比如SQLServerUniProvider.pas、MySQLUniProvider.pas这种格式命名方式很规整看名字就知道是干嘛的。这里有个容易被忽略的细节点源码版里还包含第三方库的适配单元比如ODBCUniProvider.pas内部可能依赖 ODBC API 的封装。如果你用的是源码版做二次开发最好别把这些 Provider 目录里的文件合并到自定义目录里保持原目录结构因为 Devart 在编译时会按相对路径找依赖单元你挪了位置IDE 的搜索路径设置就得跟着改。2.2 版本兼容性确认8.3.1 支持的数据库版本和 IDE 版本8.3.1 这个版本号对应的是 UniDAC 8.3 系列的维护版本。它支持的 IDE 大致从 RAD Studio XE 到最新版比如 Delphi 11/12同一套源码在不同 IDE 版本下编译时会自动通过条件编译识别开发环境。支持的数据库包括 Oracle 12c 及以上、SQL Server 2008 及以上、MySQL 5.7/8.0、PostgreSQL 9.4 及以上、SQLite 3.x、MariaDB 等一长串清单。启动编译之前建议你确认两件事第一IDE 版本最好在官方支持列表内第二如果项目里同时装了其他 Devart 组件比如 ODAC、SDAC尽量选同批次的版本避免包间依赖的单元版本不一致导致编译冲突。我在一台机器上装了 Devart 全家桶遇到过DAC目录下的公共单元如DBAccess.pas被 ODAC 的旧版本覆盖导致 UniDAC 编译报unit not found的问题这个坑后面会详细说。2.3 源码版与安装版的差异二进制包 vs 可编译可调试的源码安装版装好后IDE 里出现的是编译好的组件和隐藏实现的 DCU 文件。你能用但看不到里面是怎么写的。源码版把.pas原原本本给你了这意味着你能单步跟踪进 UniDAC 内部代码、能修改单元文件的自定义逻辑、能用 IDE 的 View-Debug Units 查看源码。代价也很明显环境配置复杂度上了一个级别而且如果对 Delphi 包机制不熟悉光配置环节就能劝退不少人。我的建议是如果首次用 UniDAC 且项目比较赶先用安装版跑通功能之后再换源码版排查深水区的问题。如果你已经确定要用源码版下面这一节的实际操作流程可以直接照着做。3. 环境准备与编译实操从解压到 IDE 中出现 UniDAC 控件开始之前列一下我这次的环境Windows 11 专业版、RAD Studio Delphi 11.3、UniDAC 8.3.1 src。不同 Delphi 版本比如 XE7 或 10.4操作入口名称可能略有差异但思路完全一致。3.1 第一步配置 IDE 库搜索路径让编译器能找到源文件打开 Delphi IDE菜单 Tools Options Language Delphi Library在 Library paths 里加入以下路径按实际解压目录替换D:\Libs\unidac_8.3.1_src\Source\DAC D:\Libs\unidac_8.3.1_src\Source\UniDAC D:\Libs\unidac_8.3.1_src\Source\Oracle D:\Libs\unidac_8.3.1_src\Source\SQLServer D:\Libs\unidac_8.3.1_src\Source\MySQL这里有个关键细节不要只加Source根目录。因为 Delphi 的库搜索路径是扁平的编译器只会直接搜索你列出的目录不会递归遍历子目录。如果你只把Source根目录加进去编译时绝对会报找不到DBAccess.pas或Uni.pas。把下面用到的Provider目录也一并加上比如 PostgreSQL、SQLite、InterBase因为UniProvider.pas在初始化注册时可能会引用到各个 Provider 单元。如果你缺了某个目录编译期不一定报错但运行时用哪个数据库连接就可能提示未注册 provider。提示库路径配置只影响编译时查找。运行时是否缺 DLL 取决于你用的数据库类型与连接方式。Unix 风格的源码包我会优先放纯英文路径目录含中文或空格时老版本 IDE 偶尔会出现奇怪的问题。3.2 第二步编译运行时包并安装设计时包源码版的核心是 BPLBorland Package Library包机制。UniDAC 跟 IDE 相关的包主要分两种运行时包Runtime Package提供基础功能运行程序时要用设计时包Design-time Package负责在 IDE 工具栏注册组件只在设计期加载。打开Source\Packages目录会看到按 IDE 版本和平台命名的.dpk文件比如dclUniDAC120.dpk这种命名方式数字后缀对应不同 IDE 版本不同版本有对应编号。先右键打开运行时包通常是UniDAC.dpk或dacUniDAC.dpk并执行 Build再打开设计时包带dcl前缀的.dpk执行 Build 然后 Install。设计时包编译成功后IDE 会弹出提示框告诉你Package ... installed这时候你在组件面板里就能看到数据访问页TUniConnection、TUniQuery、TUniTable、TUniStoredProc连接组件页TUniSQLMonitor、TUniScript特殊功能页TUniTransaction、TUniUpdateSQL3.3 第三步最小验证——新建项目跑通一条查询编译安装只是工程的前半场验证才是关键。新建一个 VCL 应用程序在窗体上放一个 TUniConnection、一个 TUniQuery、一个 TDataSource 和 TDBGrid拖一条线把数据源连起来然后设置连接参数字段Server、Database、Username、Password、Port按数据实际情况填。以 MySQL 为例UniConnection1.ProviderName : MySQL; UniConnection1.Server : 127.0.0.1; UniConnection1.Database : testdb; UniConnection1.Username : root; UniConnection1.Password : ********; UniConnection1.Port : 3306; UniConnection1.Connect;ProviderName就用你想连的数据库名MySQL、SQL Server、Oracle、PostgreSQL、SQLite 等。连接成功后TUniQuery的 SQL 写一句SELECT * FROM user_info WHERE status 1Open之后把Active设为 TrueGrid 里能出数据就说明整个流水线通了。这一步能验证前面所有编译和配置工作是否到位同时也能确认 Provider 注册是否生效。3.4 第四步编译参数与平台位数的常见配置如果你的目标平台是 64 位Windows 64-bit记得查看 Packages 目录下是否有对应的.dpk是需要重新编译的。有些历史版本 32 位编译通过但 64 位平台编译会报 missing unit这是因为个别 Provider 依赖了 32 位专用库。建议在项目里分别验证两个平台。另外运行时包的编译最好用 Release 配置Debug 配置生成的文件带调试信息运行时状态更繁琐部署时容易带上调试依赖。不过调试 UniDAC 内部代码的时候用 Debug 版本反而方便这个按需选。4. 源码核心单元解析读懂 UniDAC 的通用抽象层与 Provider 机制这一节我要挑几个核心单元出来讲帮你想清楚如果你要改源码该从哪里下手。4.1 DBAccess.pas 与 Uni.pas 的作用与关键类DBAccess.pas是整个 DAC 框架的基础里面定义了TCustomDAConnection、TCustomDADataSet这些核心基类。所有数据库访问对象都从这里继承。它处理了大量底层事务包括连接生命周期管理、事务作用域、字段类型映射框架以及数据读取缓存。几乎所有的 Provider 都是基于这个基类做接口实现。Uni.pas是 UniDAC 对外的公开 API 层。你在 IDE 里拖出来的TUniConnection、TUniQuery就定义在这里。它内部负责多数据库调度当你设置ProviderName时它会去注册表内部注册表不是 Windows 注册表里找到对应 Provider 的 Class 并创建实例。这里你能清楚地看到 UniDAC 如何做到一套代码多库切换——本质就是策略模式的典型应用。4.2 Provider 目录结构每个数据库一个子目录的封装逻辑按数据库区分目录的结构是 UniDAC 源码版最值得学习的点。每个 Provider比如SQLServerUniProvider.pas都实现了一个或多个隐藏接口这些接口定义在UniProvider.pas中。Provider 内部的职责划分很单一提供数据库特定的连接参数校验和默认值把公共 SQL 语法指令翻译成目标数据库适用的语法实现定位、修改、删除等操作时所需的特定 SQL 片段处理各数据库返回的错误码到统一错误对象的映射。例如Oracle 的 Provider 会有OracleUniProvider.pas里面封装了 OCI 的调用SQL Server 的 Provider 使用 OleDB 或直接调用 TDS 协议。如果你要支持一个新的数据库最粗暴的方式是复制一个 Provider 目录然后改实现从源码结构上看完全可行——当然工程量大不大是另一回事。4.3 连接池、事务隔离与自动提交这些高级特性的源码位置如果你关心性能调优几个关键机制的源码位置值得记下来。连接池相关的类在DBAccess.pas中搜索TPooledConnection或DACPooling就能找到。连接池的开启通常是在连接字符串里加PoolingTrue参数但具体实现逻辑在这个文件里你可以根据实际场景修改池的上限、空闲超时等判断条件。事务隔离级别和自动提交行为也在DBAccess.pas里搜索TTransactionIsolationLevel和AutoCommit相关属性。Uni.pas的TUniConnection层会把事务参数透传给底层TCustomDAConnection。比如 Oracle 的读已提交、MySQL 的可重复读在不同数据库下默认值不同全部由各 Provider 传入默认配置。这里想改全局默认隔离级别从同一个地方改是可行的。5. 常见问题与排查技巧实录源码版编译与使用中的坑实践过程中天天有人踩坑我把高频问题和排查思路整理成一张表再挑三个最典型的展开细说。5.1 高频问题速查表症状常见原因解决方案编译报找不到DBAccess.pas库搜索路径没配全把Source\DAC等子目录逐个加入 Library path安装设计时包提示one or more units already in useDelphi 已加载同名设计时包先卸载旧包或检查 IDE 里是否已装安装版组件组件面板不出现 UniDAC 控件设计时包未安装或安装不彻底重新 Build 带dcl前缀的包并执行 Install连接 SQL Server 报 provider not registered缺少对应的 Provider 单元搜索路径将Source\SQLServer加入搜索路径重新编译运行时报无法定位dac*.bpl运行时包未编译或未加入系统路径编译运行时包并在项目选项中加上 Runtime Packages切换平台32/64位后编译失败目标平台包未重新编译用目标平台重新 Build 相应.dpk5.2 避坑案例一库搜索路径导致的 Unit not found 报错我最初把Source根目录加进 Library path觉得编译器聪明地会自己子目录递归结果编译 Demo 项目时直接报E1025 Unsupported language feature之类的错误查下来是文件找不到F2613 Unit DBAccess not found。问题就是因为 Delphi 查找单元文件时不会递归搜索子目录。后来把所有涉及Source下的一级子目录全加进去问题瞬间消失。这个坑的教训是凡是报 unit not found先查库搜索路径。5.2 避坑案例二旧版本 DCU 缓存导致行为异常这里我再展开讲一个更隐蔽的坑DCU 缓存干扰。你在编译过安装版项目后IDE 的$(BDS)\Imports或项目的 Output 目录里可能残留旧版本的Uni.pas.dcu。如果库搜索路径里还有安装版路径或者多个路径混杂编译器可能选择旧 DCU 而不是你刚刚编译的新源码。这时候即使代码改对了行为仍跟老版本一样排查起来很迷惑。解决办法打开项目选项的 Delphi Compiler Output 设置查看 DCU 输出目录同时检查 Global Library Path 里有没有残留的 Devart 安装目录比如C:\Program Files (x86)\Devart\UniDAC\...。把旧路径清掉只保留源码版的Source路径。改完参数后做一次全面清理Project Clean然后重新 Build避免被缓存坑。5.3 避坑案例三DAC 公共单元被其他组件覆盖Devart 的几个数据访问组件ODAC、SDAC、PgDAC 等共用DAC目录里的基础框架但不同组件的DBAccess.pas版本可能不一致。如果机器上装了多个 Devart 组件并且库路径配置时后添加的路径覆盖了先添加的路径编译 UniDAC 时会引用到错误的DBAccess.pas出现运行时报Class not registered或编译报单元版本不一致。我的方法是把所有 Devart 组件库路径统一放在一组源码版 UniDAC 的路径放在这组的最前边。Delphi 库搜索路径的查找顺序是声明顺序的排在最前面的优先被命中。这么处理后多个组件共存的问题基本消停。5.4 性能与部署小提示用源码版编译出来的程序记得在项目选项里勾选Build with runtime packages的时机。如果你是静态链接不勾选生成的 exe 体积会大不少但在没有装 Delphi 的机器上也能直接跑如果选择了使用运行时包exe 体积小但部署时要把对应的dac*.bpl和数据库客户端库一并带上。我建议小工具用静态链接内部分发的大系统用动态运行库方式维护更方便。数据库客户端依赖也有说法比如连 Oracle 还是要装 Instant Client连 SQL Server 用 OleDB 的话要确保系统有对应驱动连 MySQL 官方 DLL 版本不能太老。这些基本知识结合项目实际情况合理安排即可。6. 源码版使用的额外心得调试、定制与后续维护折腾源码版最大的快感在于可以在组件内部加了断点跟着执行流程一步步走下去真正理解一次连接建立时 UniDAC 做了什么。这个能力在排查为什么连接慢为什么连接数一直在涨这种问题时有奇效。调试方式很简单IDE 中打开Uni.pas或DBAccess.pas在Connect方法里设断点F9 跑起来F8 一步步跟。你能看到它先初始化 Provider、再建立底层连接、然后执行登录脚本、最后触发 AfterConnect 事件。这个流程清楚了你写业务代码时会更有底气。定制方面我见过有人改 UniDAC 源码实现自定义的加密连接串规则把User_Name和Password在赋值给连接对象之前做一层解密再绕进连接流也有人把默认的字符串字段类型映射改成各数据库更符合自己业务的映射比如把 SQLite 的BLOB在TUniQuery里自动读成TBytes而不是TBlobField。这都属于在源码版加持下能玩出的高级操作。最后提醒一句维护层面的事源码版没有官方自动升级工具每次 Devart 发布新版你都得手动下载源码包覆盖。如果你自己改了源码升级时就得仔细做 diff。我的建议是自己做的模块尽量保持增量文件方式别去改原厂文件改动集中在新加的独立单元里这样升级的时候只需要维护新增文件不用每次跟官方 diff 一遍。根据个人经验源码版折腾下来真正用到的核心改动其实不多但对 UniDAC 的整体理解提升是很扎实的。值不值得装取决于你对这层封装的掌控欲有多强。如果你只是想连数据库跑业务那安装版稳妥如果你就是我这类喜欢把依赖拆开看一眼的人源码版会用到很顺。本文还有配套的精品资源点击获取
返回列表