从它的 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 配置内容。
我也有类似的事情。
- 从 Web 应用程序保存到数据库的配置内容。
- Web 应用调用 sql 作业。
- 作业启动 ssis 包。
- Web 应用程序每分钟查询一次,以查看作业是否已完成以及 returns 成功或失败给用户。
我必须修改现有的 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 配置内容。
我也有类似的事情。
- 从 Web 应用程序保存到数据库的配置内容。
- Web 应用调用 sql 作业。
- 作业启动 ssis 包。
- Web 应用程序每分钟查询一次,以查看作业是否已完成以及 returns 成功或失败给用户。