求助:VS2022中SSIS脚本任务无法加载脚本执行的解决方法
SSIS脚本任务报错“Cannot load script for execution”解决方案
核心问题排查与修复步骤
1. 缺失Microsoft.SqlServer.Dts.Runtime.dll的处理
- 确认SSIS组件完整安装:打开SQL Server安装中心,选择“维护”→“修复”,确保勾选SSIS相关组件并完成安装。该DLL默认路径为
C:\Program Files\Microsoft SQL Server\150\DTS\Binn(SQL Server 2019对应版本号150)。 - 手动注册DLL:以管理员身份打开命令提示符,执行:
regsvr32 "C:\Program Files\Microsoft SQL Server\150\DTS\Binn\Microsoft.SqlServer.Dts.Runtime.dll" - 修复Visual Studio引用:在SSIS脚本任务的项目中,右键“引用”→“添加引用”,找到并添加
Microsoft.SqlServer.Dts.Runtime(版本需与SQL Server 2019匹配)。
2. 脚本代码适配SSIS环境
控制台项目代码直接移植到SSIS脚本任务存在兼容性问题,需修改为SSIS标准结构:
- 移除原
Main方法,改用SSIS自动生成的ScriptMain类中的Main入口。 - 异步方法需同步调用(SSIS脚本任务默认不支持异步入口),用
Task.Run().Result实现同步等待。 - 替换
Console.WriteLine为SSIS日志记录方法Dts.Events.FireInformation。
修改后的适配代码示例:
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Net.Http; using System.Text; using Newtonsoft.Json; using System.Data.SqlClient; using System.Collections.Generic; public class ScriptMain : UserComponent { public override void Main() { try { var apiData = FetchDataFromApi().Result; var jsonObject = JsonConvert.DeserializeObject<YourJsonWrapper>(apiData); InsertDataToSqlServer(jsonObject.data); Dts.TaskResult = (int)DTSExecResult.Success; } catch (Exception ex) { Dts.Events.FireError(0, "API数据获取失败", ex.Message, string.Empty, 0); Dts.TaskResult = (int)DTSExecResult.Failure; } } private static async Task<string> FetchDataFromApi() { string apiUrl = "<ApiURL>"; string apiUsername = "<Username>"; string apiPassword = "<Password>"; string apiKey = "<API_Key>"; using (var client = new HttpClient()) { var authToken = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{apiUsername}:{apiPassword}")); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authToken); var jsonContent = new { api_key = apiKey }; var content = new StringContent(JsonConvert.SerializeObject(jsonContent), Encoding.UTF8, "application/json"); var response = await client.PostAsync(apiUrl, content); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } } public static void InsertDataToSqlServer(List<ApiResponse> apiData) { string connectionString = "Data Source=<Server Name>; Initial Catalog=<DB Name>; Integrated Security=True;"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); foreach (var record in apiData) { string query = "INSERT INTO Test1 (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) VALUES (@Value1, @Value2, @Value3, @Value4, @Value5, @Value6, @Value7, @Value8, @Value9, @Value10)"; using (SqlCommand command = new SqlCommand(query, connection)) { command.Parameters.AddWithValue("@Value1", record.A1); command.Parameters.AddWithValue("@Value2", record.A2); command.Parameters.AddWithValue("@Value3", record.A3 ?? (object)DBNull.Value); command.Parameters.AddWithValue("@Value4", record.A4); command.Parameters.AddWithValue("@Value5", record.A5 ?? (object)DBNull.Value); command.Parameters.AddWithValue("@Value6", record.A6 ?? (object)DBNull.Value); command.Parameters.AddWithValue("@Value7", record.A7 ?? (object)DBNull.Value); command.Parameters.AddWithValue("@Value8", record.A8); command.Parameters.AddWithValue("@Value9", record.A9); command.Parameters.AddWithValue("@Value10", record.A10); command.ExecuteNonQuery(); } } } } public class ApiResponse { public string A1 { get; set; } public string A2 { get; set; } public string A3 { get; set; } public string A4 { get; set; } public string A5 { get; set; } public string A6 { get; set; } public string A7 { get; set; } public string A8 { get; set; } public string A9 { get; set; } public string A10 { get; set; } } public class YourJsonWrapper { public int status { get; set; } public List<ApiResponse> data { get; set; } } }
3. 环境兼容性验证
- 确认SSIS项目的
TargetServerVersion设置为SQL Server 2019,与已安装版本一致。 - 检查脚本任务的.NET版本:右键脚本任务→“编辑脚本”→项目属性,确认目标框架为.NET Framework 4.7。
- 权限检查:运行SSIS包的账户需有读取
C:\Program Files\Microsoft SQL Server\150\DTS\Binn目录的权限,以及目标SQL Server的写入权限。
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

