SQL Server 2019下用C#执行SSIS .dtsx包遇故障求助
针对SQL Server 2019用C#程序化执行SSIS包的问题解答
1. SQL Server 2019执行SSIS包是否需要额外DLL?
是的,除了你已引用的Microsoft.SQLServer.DTSPipelineWrap.dll、Microsoft.SqlServer.DTSRuntimeWrap.dll、Microsoft.SqlServer.ManagedDTS.dll、Microsoft.SQLServer.PipelineHost.dll,还需要以下关键依赖:
Microsoft.SqlServer.DTSPipeline.dll:这个DLL在GAC中存在,是SSIS数据管道的核心依赖,运行时必须能被加载,即使你不直接在项目中引用,也需要确保它在GAC或应用程序可访问路径中。- 非托管底层DLL:比如
dtspipeline.dll、dtsruntime.dll等,这些位于C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn目录下,运行时需要该目录在系统PATH中,或者你的应用程序工作目录指向此处。 - 注意:SSIS 2019依赖一套完整的运行时组件,仅手动引用几个DLL容易遗漏底层依赖,这也是你运行时失败的常见原因。
2. 是否应引入Microsoft.SqlServer.Management.IntegrationServices.dll?
取决于你的执行方式:
- 如果是直接加载本地.dtsx文件执行:不需要这个DLL,核心依赖是
Microsoft.SqlServer.ManagedDTS.dll。 - 如果是通过SSIS目录(SSISDB)执行已部署的包:必须引入这个DLL,它提供了与SSISDB交互的API,用于启动包执行、监控状态、获取日志等管理操作。
3. 针对SQL Server 2019用C#执行SSIS包的官方推荐方案
官方更推荐两种标准化方案,而非手动打包自定义NuGet包:
方案一:使用官方NuGet包直接加载本地包
使用官方发布的Microsoft.SqlServer.ManagedDTS NuGet包(版本选择15.x系列,对应SQL Server 2019),无需手动复制DLL。示例代码:
using Microsoft.SqlServer.Dts.Runtime; var packagePath = @"C:\YourPackage.dtsx"; var app = new Application(); Package package = app.LoadPackage(packagePath, null); // 设置包参数(如果需要) package.Variables["YourVariable"].Value = "YourValue"; // 执行包 DTSExecResult result = package.Execute(); // 检查执行结果 if (result == DTSExecResult.Success) { Console.WriteLine("包执行成功"); } else { Console.WriteLine($"包执行失败,结果:{result}"); }
方案二:通过SSISDB执行已部署的包
如果你的包已部署到SQL Server 2019的SSIS目录,使用Microsoft.SqlServer.Management.IntegrationServices NuGet包(同样选15.x版本)来调用:
using Microsoft.SqlServer.Management.IntegrationServices; using System.Data.SqlClient; var connectionString = "Data Source=YourSQLServer;Initial Catalog=master;Integrated Security=SSPI;"; var ssisServer = new IntegrationServices(new SqlConnection(connectionString)); var catalog = ssisServer.Catalogs["SSISDB"]; var folder = catalog.Folders["YourFolder"]; var project = folder.Projects["YourProject"]; var package = project.Packages["YourPackage.dtsx"]; // 启动包执行 var execution = package.Execute(false, null); // 监控执行状态 while (execution.Status != Microsoft.SqlServer.Management.IntegrationServices.ExecutionStatus.Success && execution.Status != Microsoft.SqlServer.Management.IntegrationServices.ExecutionStatus.Failed) { System.Threading.Thread.Sleep(1000); execution.Refresh(); } Console.WriteLine($"包执行状态:{execution.Status}");
备选方案:调用dtexec.exe命令行
如果以上API方式遇到兼容性问题,可以在C#中启动进程调用dtexec.exe(位于C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn),示例:
var process = new System.Diagnostics.Process(); process.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\dtexec.exe"; process.StartInfo.Arguments = @"/F ""C:\YourPackage.dtsx"" /SET \Package.Variables[YourVariable].Value;""YourValue"""; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.Start(); string output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); Console.WriteLine($"执行输出:{output}"); Console.WriteLine($"退出码:{process.ExitCode}");
4. 如何确保引用DLL与2019兼容?
- 优先使用官方NuGet包:选择15.x版本的
Microsoft.SqlServer.ManagedDTS和Microsoft.SqlServer.Management.IntegrationServices,官方包会自动处理依赖和版本匹配,避免手动打包的问题。 - 匹配DLL版本来源:如果必须手动引用DLL,务必从SQL Server 2019对应的目录获取:
- 32位:
C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn - 64位:
C:\Program Files\Microsoft SQL Server\150\DTS\Binn
- 32位:
- 对齐目标平台:将C#项目的目标平台设置为x64(如果你的SSIS包是64位运行),避免32/64位不兼容导致的加载失败。
- 确认运行时环境:确保执行C#应用的机器上安装了SQL Server 2019 Integration Services Runtime(即使未安装SQL Server数据库引擎,也需要单独安装SSIS运行时)。
- 检查版本一致性:所有SSIS相关DLL的版本号必须为15.x(比如15.0.2000.5),GAC中的DLL版本也要与引用的版本一致,强命名DLL的版本不匹配会导致运行时加载失败。
额外排查建议
运行时失败的具体错误信息是关键,建议捕获并查看异常详情:
- 捕获
DtsException,查看内部异常和错误代码。 - 检查Windows事件日志中的应用程序日志,可能会有SSIS运行时的详细错误记录。
- 确认SSIS包本身已升级到2019格式:打开SQL Server Data Tools(SSDT)2019,加载包后重新保存,确保包版本与SQL Server 2019兼容。
内容的提问来源于stack exchange,提问作者KA-Yasso
相关产品推荐
相关产品推荐

