# CodeCompareDb
**Repository Path**: chusj/code-compare-db
## Basic Information
- **Project Name**: CodeCompareDb
- **Description**: 使用表结构实体代码对比数据库,快速检查项目代码和数据库是否匹配
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-23
- **Last Updated**: 2026-03-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 说明
CodeCompareDb 是一个用于对比代码实体与 Oracle 数据表字段结构差异的 WinForms 工具。

## 功能范围
- 选择实体目录,递归扫描实体代码文件。
- 读取实体中声明的 `TableName` 作为表映射依据,并解析实体字段信息。
- 连接 Oracle,读取对应表字段元数据与表说明。
- 支持选择对比项:缺失字段方向、类型(含长度)、可空性。
- 输出对比结果并支持导出 CSV(UTF-8 with BOM)。
## 输入约束
- 当前仅支持 Oracle。
- 当前仅处理文件名以 `Entity.cs` 结尾,且文件内容包含 `public static string TableName` 的实体文件。
- 当前仅校验字段差异:缺失字段、类型、长度、可空性。
- 当前映射规则:实体文件中必须声明 `TableName`(支持 `=` 与 `=>` 两种写法)。
## 实体解析与映射规则
- 表名:支持 `TableName = "T_XXX"` 或 `TableName => "T_XXX"`。
- 字段识别:仅识别包含 `get` 与 `set` 的 `public` 属性;属性名为 `TableName` 的项不会参与字段对比。
- 字段名映射:
- 默认规则:属性名直接作为列名。
- 映射常量:若存在 `public static string Field{属性名} = "COL_NAME"`,则属性 `{属性名}` 映射到列名 `"COL_NAME"`。
- 可空性推断(用于与 Oracle `NULLABLE` 对比):
- 存在 `[Required]` 视为非空。
- 类型带 `?` 视为可空。
- 常见非可空值类型(如 `int/decimal/bool/DateTime/Guid` 等)视为非空。
- 其它情况默认可空(如 `string`)。
- 长度推断(用于与 Oracle `DATA_LENGTH` 对比):
- `[MaxLength(n)]` / `[StringLength(n)]`;
- 或特性中 `TypeName="...(n)"`(例如 `varchar2(50)`)。
## 对比规则
- 表不存在:若数据库中未找到对应表,结果为“不通过”,说明为“数据库中未找到对应表”。
- 缺失字段方向(界面单选):
- 正向:以代码为准,输出“数据库缺失字段: ...”。
- 反向:以数据库为准,输出“缺失字段: ...”(即代码缺失字段)。
- 类型对比:按常见 Oracle 类型做兼容判断;不兼容时输出“类型不一致\[字段] 代码:... 数据库:...”。
- 长度对比:仅在启用“对比类型”且代码侧与数据库侧均能解析到长度时才比较;不一致输出“长度不一致...”。
- 可空性对比:由实体推断结果与数据库字段可空性不一致时输出“可空性不一致...”。
## 快速开始
1. 环境要求:Windows + .NET 8 SDK(本项目目标框架 `net8.0-windows`)。
2. 克隆仓库或下载源码到本地。
3. 运行 WinForms 工程:`src/CodeCompareDb.WinForms/CodeCompareDb.WinForms.csproj`。
4. 在界面中选择实体目录。
5. 填写 Oracle 参数:Host、Port、Service Name、User、Password(Schema 可选,默认等于 User)。
6. 按需选择对比项(缺失字段方向 / 类型 / 可空性)。
7. 点击“开始比对”查看结果。
8. 点击“导出CSV”生成结果文件。
## 开源使用(Gitee)
- 本项目会将 Oracle 连接参数保存到本机配置文件中(包含明文 Password),位置见下方“配置保存”;仓库中不包含该文件。
- 建议将仓库设为公开前,确认未提交任何包含账号口令的配置文件或截图。
## 开发者:如何修改“检索表实体 .cs 文件”的逻辑
实体扫描与解析逻辑集中在 `src/CodeCompareDb.WinForms/Services/EntityParserService.cs`,按需修改以下规则即可适配你的项目实体风格:
- 扫描范围:`ParseDirectory()` 里默认递归扫描 `*.cs`,且仅处理文件名以 `Entity.cs` 结尾的文件;如你的实体命名不一致,可调整该过滤条件。
- 是否视为实体:默认要求文件内容包含 `public static string TableName` 才会继续解析;如你的 `TableName` 声明方式不同,可调整对应正则。
- 表名提取:默认匹配 `TableName = "T_XXX"` 或 `TableName => "T_XXX"`;如需要支持其它写法,可调整表名提取正则。
- 字段提取:默认仅识别包含 `get` 与 `set` 的 `public` 属性;如你的字段来自字段成员、只读属性等,需要调整属性识别逻辑。
- 字段名映射:默认属性名=列名;若存在 `public static string Field{属性名} = "COL_NAME"`,则使用映射列名;如你的项目使用其它映射约定,可替换映射常量规则。
- 可空性与长度推断:可空性支持 `[Required]` / `?` / 常见值类型推断;长度支持 `[MaxLength]`/`[StringLength]`/`TypeName="...(n)"`;如你的项目使用不同特性,可在对应提取逻辑里扩展。
如需修改 Oracle 元数据读取(表/字段查询口径、取注释方式等),对应实现位于 `src/CodeCompareDb.WinForms/Infrastructure/Oracle/OracleSchemaReader.cs`。
## 配置保存
- 配置文件:`%AppData%\CodeCompareDb\settings.json`
- 保存内容:实体目录与 Oracle 连接参数(包含 Password,明文保存)。
## 对比结果设计
| 类名 | 表名 | 表说明 | 对比结果 | 结果说明 |
| ------ | ------ | ------ | ------ | ------ |
|
|
|
|
|
|
## 结果说明示例
- 通过:字段一致。
- 不通过:数据库中未找到对应表、数据库缺失字段、代码缺失字段、类型不一致、长度不一致、可空性不一致、解析失败(会以结果行形式追加展示)。