Files
henlo_migration_wpf10/henlo_migration_wpf10
..
2026-08-26 08:45:04 +08:00
2026-08-25 16:23:14 +08:00
2026-08-25 16:23:14 +08:00
2026-08-26 08:45:04 +08:00

恒诺迁移工具

Oracle 数据库迁移辅助工具,支持表结构、存储过程、BOS 配置的读取与写入

产品概述

恒诺迁移工具是一款基于 WPF + .NET 10 的 Windows 桌面应用,用于简化 Oracle 数据库对象(表、存储过程、BOS 配置)的跨库迁移工作。

主要功能

功能 说明
表结构迁移 读取源库表结构(DDL)、表注释、字段注释、主键/外键/索引,写入目标库
存储过程迁移 读取/写入存储过程和函数源码
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 表结构列表
bos.txt BOS 配置列表
bos_field.txt BOS 单字段配置列表,每行使用 TABLE.COLUMN 格式
prc.txt 存储过程/函数列表
data.txt 表数据列表

每行一个对象名称,读取数据库时会自动更新内容。BOS 单字段配置生成 data/{表名}.{字段名}_bos_field.txt;源库缺少单字段读取过程时,程序会从 pre/hmig_get_table_bos_field_31.prc 自动安装后再读取。

单字段配置写入时,目标库缺少的限定值组和限定值会自动补充;引用字段只做存在性和唯一性检查,不存在或不唯一时停止并报错。 若源对象是物理表且存在同名物理字段,生成的 SQL 还会检查目标表字段,并在字段缺失时按源字段类型执行 ALTER TABLE ... ADD;目标物理表不存在时直接报错。视图字段和 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 版本。

发布流程

第一步:确认版本号

  1. 打开 henlo_migration_wpf10.csproj
  2. 确认或修改 <Version> 标签为新版本号
  3. 建议同步修改 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/):

  1. henlo_migration-<版本>-full.nupkg
  2. RELEASES
  3. henlo_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 文件夹,然后重启应用。

许可证

内部使用工具。