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

reading a SSIS package variable from it's C# asp launcher

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

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

现在 child 包已被隔离,我正在尝试用 C# asp 站点替换主包。目前我可以通过网络表单获取用户参数并执行程序包,但我不知道如何从网络应用程序读取 child 的内部状态变量。

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

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


只是想让你知道,这就是我将变量从网络应用程序传递到包的方式。该包配置为从 primary/main 个包变量中设置其变量。

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 Server0\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;
        }

    }
}

您可以像处理日志文件一样将状态存储在数据库中 table,然后让您的 Web 应用程序以给定的时间间隔读取它。

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

我也有类似的事情。

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