从它的 C# asp 启动器读取 SSIS 包变量

本文关键字:包变量 SSIS 变量 读取 asp 启动 | 更新日期: 2023-09-27 18:37:21

我必须修改现有的SSIS包,才能从网站启动它。目前,此包通过双击按需启动,显示一个表单以请求 excel 文件位置和存储在包变量中的一些数据库凭据,然后将数据从 excel 文件加载到数据库中。由于过程中可能发生许多错误,因此有一个包含内部状态的包变量,以通知用户进程的哪一部分失败。

鉴于我必须从网站启动包,作为第一种方法,我将包一分为二,一个从用户那里获取信息的主包,通过包变量传递用户参数来执行从包,获取子包内部状态,然后通过通知用户此过程的最终状态来完成。包之间的通信是通过使用具有相同名称和包配置的变量(主包变量)来完成的。这适用于所有变量,但内部状态变量除外,该变量仅存在于父变量中,但在子变量中使用。由于两者共享相同的上下文,因此它可以正常工作。

现在子包已隔离,我正在尝试将主包替换为 C# asp 站点。目前,我能够通过 Web 表单获取用户参数并执行包,但我无法弄清楚如何从 Web 应用程序中读取孩子的内部状态变量。

此内部值是 0 到 12 之间的整数,其中 0 表示 ok,任何其他值表示加载表、执行 SP 或其他内容时出现问题。

有一种方法可以在包完成后从 Web 应用程序获取此包变量值?否则,我只是意识到这可以写入 Web 应用程序可以读取的日志文件中,但我想知道是否有更明智的解决方案。


只是为了让您知道,这就是我将变量从 Web 应用程序传递到包的方式。包配置为从主/主包变量设置其变量。

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SqlServer.Dts.Runtime;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Application app = new Application();
        Package package = null;
        String PackagePath = "";
        try
        {  
            string fileName = FileUpload1.PostedFile.FileName.ToString();
            fileName = Server.MapPath("App_Data//" + System.IO.Path.GetFileName(fileName));
            FileUpload1.PostedFile.SaveAs(fileName);            
            //Load DTSX    
            PackagePath = @"C:'Program Files'Microsoft SQL Server'100'DTS'Packages'Null Project'Package.dtsx";
            package = app.LoadPackage(PackagePath, null);            
            //Global package variables (same name)
            Hashtable param = new Hashtable();
            param["ServidorOrigen"] = "SQL_SERVER";
            param["UserOrigen"] = "user";
            param["PassOrigen"] = "pass";
            param["BaseDatosOrigen"] = "test_database";
            param["EstadoConexion"] = 0;
            param["EstadoPaquete"] = 0;
            param["ExcelRuta"] = fileName.ToString();
            Variables vars = null;
            foreach (DictionaryEntry entry in param)
            {
                package.VariableDispenser.LockOneForWrite(entry.Key.ToString(), ref vars);
                try
                {
                    vars[entry.Key.ToString()].Value = entry.Value.ToString();
                }
                catch
                {
                    throw new Exception("variable " + entry.Key.ToString() + " not found in package");
                }
                finally
                {
                    vars.Unlock();
                }
            }
            //Execute DTSX
            Microsoft.SqlServer.Dts.Runtime.DTSExecResult results = package.Execute();
            //Collects debugging info
            using (StreamWriter _testData = new StreamWriter(Server.MapPath("~/App_Data/log.txt"), true))
            {
                if (!package.Errors.Count.Equals(0)){
                    _testData.WriteLine(package.Errors.Count.ToString()); // Write the file.
                    ErrorEnumerator myEnumerator = package.Errors.GetEnumerator();
                    int i = 0;
                    while ((myEnumerator.MoveNext()) && (myEnumerator.Current != null))
                        _testData.WriteLine("[{0}] {1}", i++, myEnumerator.Current.Description);
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

从它的 C# asp 启动器读取 SSIS 包变量

可以将状态存储在数据库表中,就像存储日志文件一样,然后让 Web 应用按给定间隔读取该状态。

我不确定如何将变量从 Web 应用程序传递到 ssis,但您可以查看存储在 sql 数据库中的 ssis 配置内容。

我也有类似的事情。

  1. 从 Web 应用程序保存到数据库的配置内容。
  2. Web 应用调用 sql 作业。
  3. 作业启动 ssis 包。
  4. Web 应用每分钟查询一次,以查看作业是否已完成,并向用户返回成功或失败。