11 KiB
恒诺迁移工具
Oracle 数据库迁移辅助工具,支持表结构、存储过程、BOS 配置的读取与写入
产品概述
恒诺迁移工具是一款基于 WPF + .NET 10 的 Windows 桌面应用,用于简化 Oracle 数据库对象(表、存储过程、BOS 配置)的跨库迁移工作。
主要功能
| 功能 | 说明 |
|---|---|
| 表结构迁移 | 读取源库表结构(DDL)、表注释、字段注释、主键/外键/索引,写入目标库 |
| 表字段迁移 | 按 TABLE.COLUMN 读取单个物理字段;目标字段不存在时新增,已存在时跳过 |
| 存储过程迁移 | 读取/写入存储过程和函数源码 |
| BOS 配置迁移 | 读取 BOS 表配置写入目标库 |
| BOS 字段配置迁移 | 按 TABLE.COLUMN 补充目标物理字段并迁移字段配置、限定值和引用元数据 |
| 表数据迁移 | 支持表数据的导出/导入 |
| 自动更新 | 支持通过私有服务器 Velopack 自动检查更新 |
| 断点续写 | 批量写入失败后,下次从失败行继续,无需从头开始 |
技术架构
┌─────────────────────────────────────────────────────────┐
│ WPF (UI Layer) │
│ HomeWindow.xaml ← MVVM → MainViewModel.cs │
└─────────────────────┬───────────────────────────────────┘
│
┌─────────────────────▼───────────────────────────────────┐
│ Services (业务层) │
│ ├─ DbServices.cs - 核心 DDL 操作 │
│ ├─ TabServices.cs - Tab 数据读写 │
│ └─ TabConfig.cs - Tab 配置 │
└─────────────────────┬───────────────────────────────────┘
│
┌─────────────────────▼───────────────────────────────────┐
│ Data Access (数据层) │
│ └─ SqlSugar ORM + Oracle.ManagedDataAccess │
└─────────────────────────────────────────────────────────┘
项目结构
henlo_migration_wpf10/
├── App.xaml / App.xaml.cs # WPF 入口,自动更新,全局异常
├── Common/ # 公共工具
│ ├── CommonHelper.cs # 文件读写、路径配置
│ ├── SqlSugarHelper.cs # 数据库连接管理
│ └── SysConfig.cs # INI 配置读写
├── Services/ # 业务服务
│ ├── DbServices.cs # 核心:Oracle DDL 读写
│ ├── TabServices.cs # Tab 数据读写
│ └── TabConfig.cs # Tab 配置
├── ViewModels/ # MVVM
│ └── MainViewModel.cs # 主 ViewModel
├── Views/ # UI
│ ├── HomeWindow.xaml # 主窗口
│ └── ConnectionDialog.xaml # 连接配置
├── data/from/ # 索引文件(table.txt 等)
├── pre/ # 运行时辅助过程/函数脚本(BOS 读取缺失时自动安装)
├── pack.bat # Velopack 打包脚本
└── henlo_migration_wpf10.csproj
技术栈
| 类别 | 技术 |
|---|---|
| 框架 | WPF / .NET 10.0 |
| ORM | SqlSugar 5.1.4 |
| 数据库 | Oracle (ODP.NET) |
| UI 库 | HandyControl 3.5.1 |
| MVVM | CommunityToolkit.Mvvm 8.3 |
| 自动更新 | Velopack 0.0.1298 |
运行环境
- 操作系统:Windows 10/11 (x64)
- .NET:.NET 10.0 Runtime(或 Self-contained 发布)
- 数据库:Oracle 11g R2 及以上
- .NET SDK:10.0+(仅开发时需要)
使用说明
1. 初始化配置
首次使用需配置源库和目标库的连接信息:
- 源库:读取数据的数据库
- 目标库:写入数据的数据库
连接信息保存在用户配置持久目录的 config.ini 中。Velopack 安装态或便携态位于与 Update.exe 同级的根目录,普通 dotnet run/publish 运行时位于程序目录。发布包不携带该文件,首次运行会创建空配置。
从旧版本更新时,新程序会在 Velopack 删除旧 current/ 备份前迁移原 current/config.ini;后续更新只替换 current/,不会覆盖根目录中的配置。
2. 索引文件
索引文件位于 data/from/ 目录:
| 文件 | 用途 |
|---|---|
table.txt |
表结构列表 |
table_field.txt |
物理表字段列表,每行使用 TABLE.COLUMN 格式 |
bos.txt |
BOS 配置列表 |
bos_field.txt |
BOS 单字段配置列表,每行使用 TABLE.COLUMN 格式 |
prc.txt |
存储过程/函数列表 |
data.txt |
表数据列表 |
每行一个对象名称,读取数据库时会自动更新内容。表字段生成
data/{表名}.{字段名}_table_field.txt,只读取源库物理表字段和字段注释,不检查 BOS 是否维护该字段;写入时目标表不存在会报错,目标字段已存在则跳过,否则按源字段类型、默认值、可空性和注释新增。
BOS 单字段配置生成
data/{表名}.{字段名}_bos_field.txt;源库缺少单字段读取过程时,程序会从
pre/hmig_get_table_bos_field_31.prc 自动安装后再读取。
单字段配置写入时,目标库缺少的限定值组和限定值会自动补充;引用字段只做存在性和唯一性检查,不存在或不唯一时停止并报错。
BOS 单字段读取会先解析 AD_TABLE.REALTABLE_ID:未设置时使用原 BOS 表名,已设置时沿映射找到最终实际表名(支持多级映射,缺失、不唯一或循环引用时报错)。物理字段读取和目标库写入均使用实际表名,BOS 配置仍按原 BOS 表名迁移。
只有实际对象是普通物理表且源字段存在时,才生成 ALTER TABLE ... ADD:写入前检查目标实际表字段,已存在则跳过物理 DDL,不存在才新增;目标实际表不存在或为视图/物化视图时报错。源普通视图、物化视图和没有物理字段的 BOS 计算字段仅导出 BOS 配置,不生成物理 DDL。独立“表字段”页签不受此 BOS 映射规则影响。
3. 基本操作流程
1. 配置源库/目标库连接
2. 点击「读取」按钮 → 从源库读取对象定义,保存到文件
3. 在右侧编辑区查看/修改代码
4. 点击「写入」或「批量写入」→ 写入目标库
4. 批量写入断点续写
当批量写入过程中某行失败:
- 记录失败行的索引(断点)
- 按钮显示「继续写入」
- 修复问题后再次点击「继续写入」,从失败行继续
- 全部成功后自动重置断点
5. 自动更新
支持通过私有服务器自动检查更新(基于 Velopack):
- 应用启动时自动检查更新
- 也可手动点击「检查更新」按钮
- 检测到新版本后,下载并自动安装,重启后生效
- 更新过程中用户数据(data/、pre/)会自动备份并恢复
版本管理
版本号来源
版本号唯一数据源是 henlo_migration_wpf10.csproj 中的 <Version> 标签:
<PropertyGroup>
<Version>1.0.15</Version>
<AssemblyVersion>1.0.15</AssemblyVersion>
</PropertyGroup>
编译时 MSBuild 自动将版本号写入 Version.ini,程序启动时读取并显示在标题栏。
版本号命名规范
| 场景 | 规则 | 示例 |
|---|---|---|
| Bug 修复 | 递增 patch | 1.0.15 → 1.0.16 |
| 新增功能(向下兼容) | 递增 minor | 1.0.15 → 1.1.0 |
| 破坏性变更 | 递增 major | 1.0.15 → 2.0.0 |
建议:日常维护使用 patch 版本,小功能用 minor 版本。
发布流程
第一步:确认版本号
- 打开
henlo_migration_wpf10.csproj - 确认或修改
<Version>标签为新版本号 - 建议同步修改
Version.ini中的版本号(保持一致)
⚠️ 版本号只能递增。Velopack 根据版本号判断是否需要更新。
第二步:本地打包
在项目根目录双击运行 pack.bat:
# pack.bat 自动完成以下步骤:
# 1. 从 csproj 读取 <Version>
# 2. dotnet publish Release 版本
# 3. 创建 data/ 目录结构(.gitkeep 占位)
# 4. vpk pack 打包为 nupkg
# 5. 输出到 releases/ 目录
打包产物在 releases/ 目录:
| 文件 | 说明 |
|---|---|
henlo_migration-win-Portable.zip |
便携版压缩包,直接分发给用户 |
henlo_migration-<版本>-full.nupkg |
Velopack 更新包,上传到服务器 |
RELEASES |
Velopack 更新元数据文件,随 nupkg 一起上传 |
第三步:上传到更新服务器
将以下三个文件上传到服务器对应目录(当前配置:http://zjhenlo.henlo.net:8878/henlo_migration/auto_update/):
henlo_migration-<版本>-full.nupkgRELEASEShenlo_migration-win-Portable.zip(可选,用户可直接下载这个完整包)
⚠️ 必须同时上传
RELEASES文件,Velopack 依赖它判断版本信息。
第四步:通知用户更新
用户端应用会在启动时自动检测到新版本,弹出更新提示。
如需手动触发测试更新,可删除程序目录下的 .velopack 缓存文件夹后重启。
注意事项
- 写入前请确认目标库表是否存在,工具不会自动建表(表结构 DDL 除外)
- 批量写入失败时会停止,后续行不会被处理
- 索引文件修改后需重新读取才能生效
- 便携版数据(data/、pre/)在更新时自动备份恢复,无需手动迁移
常见问题
Q: 写入时报 ORA-00922 错误? A: 可能是表名或列名使用了 Oracle 保留字,需要加双引号。工具已自动处理大部分情况。
Q: 如何只更新部分行? A: 使用上下箭头调整行的顺序,或使用「移到顶部」功能调整优先级。
Q: 索引文件在哪里?
A: data/from/ 目录下。
Q: 更新后用户数据会丢失吗? A: 不会。Velopack 更新前会自动将 data/ 和 pre/ 备份到 %TEMP%,更新后恢复。
Q: 如何强制重新检测更新?
A: 删除程序目录下的 .velopack 文件夹,然后重启应用。
许可证
内部使用工具。