标签: #数据访问

C# Excel 导入导出实战:多层表头解析 + 合并单元格展开 + 必填列校验 + 多 Sheet 合并

业务 Excel 模板永远不干净:双层表头、合并单元格、多 Sheet 语义不同。本文拆解一套生产级封装,讲清 MinRow/MaxDataRow 数据区定位、合并单元格铺值而非 UnMerge、两种前缀拼接策略合成唯一列名、必填列前置校验、多 Sheet 裁剪合并加来源标记,以及按字符串导出规避科学计数法与日期格式化的经验。

SQL Server 差集同步实战:NOT EXISTS 补缺清孤儿与唯一索引竞态兜底(2601/2627)

让一张派生表始终与数据源保持一致,逐条循环插入既低效又有竞态。本文分享一套集合式差集同步方案:INSERT...WHERE NOT EXISTS 一条语句补齐缺失组合,反向 NOT EXISTS 清理孤儿记录,再用唯一索引搭配 C# 的 catch...when 异常过滤器精准放行 2601/2627 并发冲突,把 check-then-insert 竞态变成可安全忽略的正常现象,并说明为什么不用 MERGE。

C# 连接字符串集中管理实战:Interlocked 原子守卫 + volatile 双检锁 + 异步重试

连接字符串散落在 appsettings.json 与 App.config 之间?本文基于 SwitchData 项目的 DbConnectionManager,用 Interlocked.Exchange 实现无锁一次性初始化,volatile 双检锁保证回退加载的线程安全,ConcurrentDictionary 缓存解密后的连接串,解密收口在单一方法,并配套 WaitForReadyAsync 异步重试等待数据库就绪。完整代码 + 讲解,一套可以直接抄走的静态管理类设计。

C# 动态查询条件构建实战:组合模式 + 运算符注册表 + 参数化 SQL 防注入完整方案

多可选参数查询接口还在用字符串拼接 SQL?本文拆解一套组合模式动态查询条件构建器:FilterCondition 叶子节点 + FilterGroup 逻辑组把 WHERE 子句建模成对象树,17 种运算符全部注册到一张声明式注册表,递归遍历时参数编号贯穿全树递增,值走 DbParameter、列名走元数据白名单校验,从根上堵死注入路径,并逐一讲清 LIKE 通配符转义、NULL 三值逻辑、空条件跳过等容易踩的坑。

SQL Server 批量核对查询实战:临时表 + SqlBulkCopy + JOIN 一次比对十万级数据

批量核对场景下循环单条查询会带来 N+1 网络往返,IN 列表又受 2100 个参数上限约束。本文基于真实落地的 BulkQueryData 实现,拆解「临时表 + SqlBulkCopy + JOIN」方案:SELECT INTO WHERE 1=2 结构克隆与 identity 列处理、行号列回传技巧、NULL 空值等价匹配条件、统计回填与 try/finally 幂等清理,万行级核对从分钟级降到秒级。

DataTable 扩展方法实战:从零构建 ADO.NET 数据后处理工具集(Trim/Schema/映射/落库零分配完整实现)

DataTable 用得多了就会发现,所有项目都在重复这些操作:去空行、Trim 字符串、列名/索引互查、Schema 克隆、DataRow 转 Dictionary、ToSortedTable、FirtRowToColumnName。本文基于 SwitchData 项目中真实在用的 DataTableExtensions(1700+ 行),把高频数据后处理操作整理成统一的扩展方法工具集,涵盖倒序遍历、Span 零分配清洗、CloneSchema/CopyData 投影、SplitColumn/MergeColumns/FillDownColumns 复杂业务转换等完整实现。

从零实现轻量级 ADO.NET ORM:特性驱动 + Expression Tree 委托 + 多级 ConcurrentDictionary 缓存完整架构

本文带你拆解一个生产环境真实在用的轻量级 ADO.NET ORM 框架。它基于特性驱动实体映射,用 Expression Tree 动态编译 Getter/Setter 委托实现零反射开销,并通过 MetadataCache、SchemaCache、CachingMechanism 三级 ConcurrentDictionary 缓存体系保证性能与线程安全。整个框架零外部依赖,代码量不过千行,却完整实现了 Dapper 的核心能力。

ConcurrentDictionary + record struct 组合键:.NET ORM 零分配缓存三层设计实战

手写 ORM 或数据库抽象层时,缓存是性能关键。本文从 SwitchData 项目提取一套生产级缓存方案:用 record struct 做零 GC 组合键,ConcurrentDictionary 做线程安全容器,CacheKey 包含 ConnectionString 防止串库,命中缓存时必须 Clone 可变对象(DbParameter、DataTable、List)避免被业务代码污染。四句话总结一套可直接抄过去的 ORM 缓存基础设施。

C# LINQ 表达式树深度解析:手写 ORM 如何把 Where/OrderBy 翻译成数据库查询条件

EF Core 是怎么把 LINQ 翻译成 SQL 的?答案是表达式树。本文从 SwitchData 项目中 462 行的 ExpressionParser 真实代码出发,展示手写 ORM 如何把 Where/OrderBy Lambda 翻译成结构化 QueryCondition 列表:排序解析沿方法调用链向内剥离,条件解析基于 ExpressionVisitor 深度优先遍历并还原括号语义,还包含闭包变量提取、string.Contains 转 LIKE、PredicateBuilder 动态组合等核心难点的完整实现。

C# 工厂策略模式 + Channel 管道:从零构建多格式日志解析架构

在多厂商多格式网元日志解析场景下,传统的 if/else 分支写法难以维护。本文以 SwitchData 项目为实战案例,拆解一套工厂策略模式 + Channel 异步管道 + ADO.NET 批量入库的完整架构,从接口抽象、工厂分发、Channel 背压、批量 Flush 等关键设计点入手,带你看约 500 行核心代码如何支撑百万级日志解析流水线稳定运行两年多。