Files
henlo_migration_wpf10/henlo_migration_wpf10/README.md
T

247 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 恒诺迁移工具
> 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>` 标签:
```xml
<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`:
```bash
# 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` 文件夹,然后重启应用。
## 许可证
内部使用工具。