内存爆掉时应改用流式读取:csv用streamreader手动分割或sqlbulkcopy,excel用exceldatareader分页加载;ssis调低缓冲区并禁用优化模式。

读取大体积CSV/Excel源文件时内存爆掉怎么办
直接用 File.ReadAllLines 或 DataTable.Load 读几百MB的CSV,大概率触发 OutOfMemoryException。SSIS默认缓冲区也扛不住单行超长或列数动态变化的文件。
- 改用流式读取:对CSV用
StreamReader+ 手动分割(注意引号嵌套),或上Microsoft.Data.SqlClient的SqlBulkCopy配合格式文件 - Excel别碰
EPPlus全加载——改用ExcelDataReader的AsDataSet(false)禁用缓存,或分页调用LoadNextRow() - SSIS里把
DefaultBufferMaxRows调低(比如5000),同时开AutoAdjustBufferSize,但得关掉RunInOptimizedMode,否则它会偷偷绕过你的设置
SSIS脚本组件里怎么安全传入动态文件路径
硬编码路径在部署后必然报 System.IO.FileNotFoundException;用变量又容易在设计期和运行期值不一致。
- 在脚本组件的
Input0_ProcessInputRow之前,先检查this.Variables.SourceFilePath != null,空就抛InvalidOperationException,别等读到一半才崩 - 路径拼接必须用
Path.Combine,别用字符串+,Windows下反斜杠转义会吃掉一个 \ - 如果路径来自配置表,记得在
PreExecute里刷新变量值——SSIS变量不会自动重载,尤其跨包调用时
C#自定义ETL中解析带BOM的UTF-8 CSV乱码
用 StreamReader 默认构造函数读含BOM的文件,第一行字段名常出现 ID 这种前缀,后续所有字段映射全错。
- 显式指定编码:
new StreamReader(path, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)) - 或者更稳:先用
File.ReadAllBytes检查头三个字节是否为0xEF, 0xBB, 0xBF,是的话跳过前3字节再构造MemoryStream - SSIS里对应要关掉
Unicode选项(哪怕文件是UTF-8),选65001编码并勾选Text qualifier—— 否则BOM会被当作文本定界符吃掉
处理日期字段时CultureInfo踩坑导致数据错位
“2023-03-04”在 en-US 是3月4日,在 de-DE 是4月3日;SSIS默认用服务器区域设置,C#代码若没显式指定,上线后可能批量写反月份和日期。
- 统一用
DateTime.ParseExact(line[2], "yyyy-MM-dd", CultureInfo.InvariantCulture),绝不用Parse - SSIS的Flat File Connection Manager里,日期列的数据类型必须设为
database timestamp [DT_DBTIMESTAMP],不是string [DT_STR],否则隐式转换按系统locale走 - 导出时也一样:
dt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture),别信ToString()默认格式
真正麻烦的是混合格式源文件——比如有的行是“2023/03/04”,有的是“04-MAR-2023”。这种没法靠单个 ParseExact 解决,得先用正则识别模式再分支处理,漏一条规则就会静默丢数据。










