HospitalStats.QueryEngine

让 .NET 直连 Oracle 11g US7ASCII
告别中文乱码与 ROWNUM 分页噩梦

纯本地运行 · 零外网依赖 · 36 KB 轻量引擎
专为老 HIS 数据库设计,AGPL 开源

引擎源码 (AGPL)

老 HIS 数据库的三大痛点

中国数万家医院仍在运行 Oracle 10g/11g + US7ASCII 字符集,开发者每天面对这些难题。

🔤

中文变成问号

US7ASCII 传输层把超范围字节全替换成 ?,患者姓名、药品名称全部损坏。用 NLS_LANG 绕?参数绑定又出问题。

📟

OFFSET 不存在

Oracle 10g/11g 不支持 OFFSET/FETCH,每次分页都得手写 ROWNUM 三层嵌套子查询。写错一层就崩。

🧩

动态 SQL 拼接地狱

用户可变筛选条件 × 多表 JOIN × 聚合 × 排序 —— 每种组合都是一段新代码,维护成本指数级上升。

双路径引擎:一条 SQL,两套保障

无论你是粘贴原始 SQL,还是可视化配置查询字段,引擎自动处理编码和分页。

US7ASCII 中文还原

引擎在 SQL 执行前自动对字符串列包裹 RAWTOHEX 包装,对中文参数值 hex 编码;结果返回前自动解码还原。全程对调用方透明。

RAWTOHEX GBK 解码 LIKE 通配保留

ROWNUM 自动分页

引擎内部生成三层嵌套子查询,你只需传 page 和 pageSize。

Oracle 10g 11g 12c+

12 种操作符

EQ / NE / GT / GTE / LT / LTE / LIKE / NOT LIKE / IN / NOT IN / BETWEEN / NOT BETWEEN —— 参数化查询,零 SQL 注入风险。

// 10 行代码完成查询 var request = new QueryEngineRequest { ConnectionString = "Data Source=ORCL;...", CharSetOverride = "gbk", // 一行搞定 US7ASCII MainTable = new EngineTableDef { TableName = "OUTP_BILL_ITEMS", SchemaName = "HOSPITAL", Alias = "A" }, Fields = { new() { ColumnName="ITEM_NAME", Alias="项目名" } }, Filters = { new() { Id=1, ColumnName="ITEM_NAME", Operator="LIKE", DefaultValue="%阿莫西林%" } }, Page = 1, PageSize = 50 }; var result = await engine.ExecuteAsync(request); // result.Total result.Rows result.ElapsedMs

运行截图

生产环境实际运行效果

登录登录
数据源管理数据源管理
元数据管理元数据管理
表字段表字段
查询配置查询配置
查询配置-sql导入查询配置-sql导入
菜单管理菜单管理
菜单预览菜单预览
运营数据配置运营数据配置
运营数据运营数据
用户管理用户管理
角色管理角色管理

为什么选择它

不是通用 BI,不是笨重 ETL。一个专为医疗场景裁剪的轻量引擎。

🛡️

零外网依赖

License 纯本地 HMAC 验证。无网络回传,无数据收集。医院内网完全可用。

📦

36 KB 轻量

单个 DLL,四个依赖包。没有 ASP.NET、没有 EF Core、没有 Redis。

🔐

AGPL 开源

源码开放,自由使用。欢迎反馈和贡献。

🧪

批量参数化

Dapper 参数绑定,杜绝 SQL 注入。IN/BETWEEN 自动拆分参数列表。

📊

内置 Excel 导出

一行调用生成 .xlsx,自动表头加粗 + 列宽自适应。

🏗️

Raw SQL + 配置双模式

粘贴原始 SQL 直接用,也可可视化配字段/筛选/JOIN。引擎自动适配。

🔗

UNION 查询支持

自动拆分 UNION 分支,每个分支独立注入筛选条件。多院区报表一行搞定。

🎯

上下文数据权限

支持按科室/用户自动注入筛选,用户不可见不可覆盖。满足医疗数据合规。

×