# 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 工具。 ![效果图](result.png) ## 功能范围 - 选择实体目录,递归扫描实体代码文件。 - 读取实体中声明的 `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,明文保存)。 ## 对比结果设计 | 类名 | 表名 | 表说明 | 对比结果 | 结果说明 | | ------ | ------ | ------ | ------ | ------ | |
|
|
|
|
| ## 结果说明示例 - 通过:字段一致。 - 不通过:数据库中未找到对应表、数据库缺失字段、代码缺失字段、类型不一致、长度不一致、可空性不一致、解析失败(会以结果行形式追加展示)。