SSIS脚本组件作为数据源无法向SQL目标写入行
SSIS脚本组件未写入数据的问题修复
问题根源分析
- StreamReader逻辑错误:PreExecute中初始化的
textReader指向连接管理器获取的文件,但遍历stagingPath下的文件时,未使用当前文件创建新的StreamReader,反而复用旧实例,导致实际读取的不是目标文件;同时using(textReader)会自动释放资源,后续手动Close/Dispose会引发异常。 - 无效的Split操作:
ReadLine()已移除行尾换行符,用换行符拆分整行完全多余,拆分后的items[0]是整行内容,判断首字符应该直接取行的第一个字符,而非拆分结果。 - 冗余代码:AcquireConnections中获取的
rxFile未被使用,属于无效逻辑。
修正后的代码
public class ScriptMain : UserComponent { private string stagingPath = "mypath"; public override void CreateNewOutputRows() { DirectoryInfo di = new DirectoryInfo(stagingPath); FileInfo[] files = di.GetFiles("*.txt"); foreach (FileInfo file in files) { // 为每个目标文件创建独立的StreamReader using (StreamReader textReader = new StreamReader(file.FullName)) { while (!textReader.EndOfStream) { string line = textReader.ReadLine(); // 跳过空行,避免索引越界 if (string.IsNullOrEmpty(line)) continue; // 直接取首字符判断,无需拆分操作 string firstChar = line[0].ToString(); if (firstChar == "2") { PharmacyBuffer.AddRow(); // 按固定宽度要求赋值整行 PharmacyBuffer.Column0 = line; } else if (firstChar == "4") { TransactionsBuffer.AddRow(); TransactionsBuffer.Column0 = line; } } } } } }
关键调整说明
- 移除无用的
AcquireConnections、PreExecute和PostExecute重写,简化逻辑。 - 为每个遍历到的TXT文件创建独立的StreamReader,确保读取目标文件。
- 直接通过
line[0]获取首字符,避免无效拆分,增加空行判断防止索引越界。 - 输出列直接赋值整行(匹配固定宽度700的要求),如需拆分固定宽度字段可后续补充处理。
内容的提问来源于stack exchange,提问作者SidC
相关产品推荐
相关产品推荐

