SQL Server 2022迁移后DTSPipelineWrap代码适配问题求助
问题根源
SQL Server 2022对SSIS的组件模型做了调整,Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter这个内部实现类不再作为公开类型对外暴露,所以你无法通过typeof获取它的信息,但IDTSComponentMetaData100、IDTSPath100这类旧接口依然保持向下兼容,不用担心被废弃。
具体适配步骤
1. 直接使用组件固定ClassID
放弃反射获取类型名称的方式,改用DataReader Source组件的固定ClassID字符串赋值:
IDTSComponentMetaData100 newComponent = _dataFlow.ComponentMetaDataCollection.New(); // 对应SQL Server 2022的DataReader Source组件ClassID newComponent.ComponentClassID = "Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter, Microsoft.SqlServer.DataReaderSourceWrap, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
提示:ClassID中的版本号
16.0.0.0对应SQL Server 2022(160系列),后续若升级版本,只需修改版本号部分即可。
2. 补全必要的DLL引用
除了你已引用的Microsoft.SqlServer.DTSPipelineWrap.dll和Microsoft.SqlServer.DTSRuntimeWrap.dll(16.0版本),还需要添加Microsoft.SqlServer.DataReaderSourceWrap.dll的引用——这个DLL是2022版本中单独拆分出来的,包含DataReaderSourceAdapter的实现逻辑。
3. 保留IDTSPath100的原有代码
IDTSPath100接口在SQL Server 2022中完全兼容,不需要替换成更高版本的接口(比如IDTSPath130),你之前写的路径创建代码可以直接沿用:
IDTSPath100 path = _dataFlow.PathCollection.New(); path.AttachPathAndPropagateNotifications(sourceComponent.OutputCollection[0], destComponent.InputCollection[0]);
备选方案(若ClassID方式失效)
如果上述方法仍有问题,可以切换到SSIS官方推荐的托管API Microsoft.SqlServer.Management.IntegrationServices来动态创建包,这套API文档更完善,稳定性更好:
using Microsoft.SqlServer.Management.IntegrationServices; using System.Data.SqlClient; // 连接到SSISDB var conn = new SqlConnection("Server=你的服务器;Database=SSISDB;Integrated Security=True;"); var iss = new IntegrationServices(conn); // 创建或获取项目 var catalog = iss.Catalogs["SSISDB"]; var folder = catalog.Folders["你的文件夹"]; var project = folder.Projects["你的项目"]; // 创建新包 var pkg = project.Packages.New("DynamicPackage"); // 添加Data Flow任务 var dataFlowTask = pkg.Executables.Add("STOCK:PipelineTask") as TaskHost; var mainPipe = dataFlowTask.InnerObject as MainPipe; // 后续添加组件、配置路径的逻辑可参考官方文档,使用托管API提供的类型
内容的提问来源于stack exchange,提问作者FRReg

