You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:27:46