SSIS 脚本任务 - 不支持接口
SSIS Script Task - No Interface Supported
目的:我有一个包含各种包的 SSIS 解决方案,由于它们具有不同的结构,因此当前使用每个 table 的包创建了一组这些包。目的是创建一个模板包(完成),更新 variables/table 名称(完成),重新初始化和重新映射列,为每个 table.
执行包
问题:所以,如您所知,我已经到了需要重新初始化的地步,但我无法进入数据流任务并继续获得此错误:
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))
当我运行这段代码时:
//// Get Data Flow task
TaskHost tHost = pkgOut.Executables[0] as TaskHost;
MainPipe dataFlowTask = (MainPipe)tHost.InnerObject;
我使用的代码如下:
public void Main()
{
// Set Project Variables
List<string> pkgVars = new List<string>
{
@"pPR_SSIS_Catalog_Server",
@"pPR_SSIS_Catalog_Project",
@"pPR_SSIS_Catalog_Folder"
};
// Get Package
String pkgLocation = @"C:\PATH\TO\TEMPLATE\PACKAGE\a_Load_SAP_Template.dtsx";
Application app = new Application();
Package pkgIn = app.LoadPackage(pkgLocation, null);
String pkgName = "DynamicPackage";
// Add Connections (cos they're project connections and aren't stored in package)
ConnectionEnumerator allConns = Dts.Connections.GetEnumerator();
while ((allConns.MoveNext()) && (allConns.Current != null))
pkgIn.Connections.Join(allConns.Current);
// Convert new package to XML so we can cheat and just do a find and replace
XmlDocument pkgXML = new XmlDocument();
pkgIn.SaveToXML(ref pkgXML, null, null);
// Replace strings
// Set SAP table
String pkgStr = pkgXML.OuterXml.ToString();
pkgStr = pkgStr.Replace("#SAP_SRC_TABLE#", "MyF-ingSAPTables"); // Replace SAP Table Name
// Set Project Variables references == values -- REMEMBER TO CHECK FOR INT PARAMS zzz
foreach (string var in pkgVars)
pkgStr = pkgStr.Replace(@"@[$Project::" + var + @"]", @"""" + Convert.ToString(Dts.Variables[var].Value) + @"""");
// Convert back to XML
XmlDocument newXML = new XmlDocument();
newXML.LoadXml(pkgStr);
Package pkgOut = new Package();
pkgOut.LoadFromXML(newXML, null);
//// Get Data Flow task
TaskHost tHost = pkgOut.Executables[0] as TaskHost;
MainPipe dataFlowTask = (MainPipe)tHost.InnerObject; // THIS IS WHERE THE CODE ERRORS
new Application().SaveToXml(String.Format(@"D:\PATH\TO\SAVE\LOCATION\{0}.dtsx", pkgName), pkgOut, null);
Dts.TaskResult = (int)ScriptResults.Success;
}
我试过:
- 删除数据流以外的所有内容
- 重新创建了空白数据流
- 重新创建包
- 在脚本中制作了一个包并创建了数据流(这有效但是当我打开包时,数据流没有出现......可能添加错了但是当我运行 TaskHost 部分)
我不确定我还能尝试什么,我看到的信息表明我可能需要重新注册一些 .dll,但我没有管理员访问权限,我不想为某些事情经历麻烦不知道能不能用。
如有任何帮助,我们将不胜感激。
谢谢,
已修复,这是由于正在加载的 .DLL 版本不同所致。加载了旧版本,一切正常。
目的:我有一个包含各种包的 SSIS 解决方案,由于它们具有不同的结构,因此当前使用每个 table 的包创建了一组这些包。目的是创建一个模板包(完成),更新 variables/table 名称(完成),重新初始化和重新映射列,为每个 table.
执行包问题:所以,如您所知,我已经到了需要重新初始化的地步,但我无法进入数据流任务并继续获得此错误:
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))
当我运行这段代码时:
//// Get Data Flow task
TaskHost tHost = pkgOut.Executables[0] as TaskHost;
MainPipe dataFlowTask = (MainPipe)tHost.InnerObject;
我使用的代码如下:
public void Main()
{
// Set Project Variables
List<string> pkgVars = new List<string>
{
@"pPR_SSIS_Catalog_Server",
@"pPR_SSIS_Catalog_Project",
@"pPR_SSIS_Catalog_Folder"
};
// Get Package
String pkgLocation = @"C:\PATH\TO\TEMPLATE\PACKAGE\a_Load_SAP_Template.dtsx";
Application app = new Application();
Package pkgIn = app.LoadPackage(pkgLocation, null);
String pkgName = "DynamicPackage";
// Add Connections (cos they're project connections and aren't stored in package)
ConnectionEnumerator allConns = Dts.Connections.GetEnumerator();
while ((allConns.MoveNext()) && (allConns.Current != null))
pkgIn.Connections.Join(allConns.Current);
// Convert new package to XML so we can cheat and just do a find and replace
XmlDocument pkgXML = new XmlDocument();
pkgIn.SaveToXML(ref pkgXML, null, null);
// Replace strings
// Set SAP table
String pkgStr = pkgXML.OuterXml.ToString();
pkgStr = pkgStr.Replace("#SAP_SRC_TABLE#", "MyF-ingSAPTables"); // Replace SAP Table Name
// Set Project Variables references == values -- REMEMBER TO CHECK FOR INT PARAMS zzz
foreach (string var in pkgVars)
pkgStr = pkgStr.Replace(@"@[$Project::" + var + @"]", @"""" + Convert.ToString(Dts.Variables[var].Value) + @"""");
// Convert back to XML
XmlDocument newXML = new XmlDocument();
newXML.LoadXml(pkgStr);
Package pkgOut = new Package();
pkgOut.LoadFromXML(newXML, null);
//// Get Data Flow task
TaskHost tHost = pkgOut.Executables[0] as TaskHost;
MainPipe dataFlowTask = (MainPipe)tHost.InnerObject; // THIS IS WHERE THE CODE ERRORS
new Application().SaveToXml(String.Format(@"D:\PATH\TO\SAVE\LOCATION\{0}.dtsx", pkgName), pkgOut, null);
Dts.TaskResult = (int)ScriptResults.Success;
}
我试过:
- 删除数据流以外的所有内容
- 重新创建了空白数据流
- 重新创建包
- 在脚本中制作了一个包并创建了数据流(这有效但是当我打开包时,数据流没有出现......可能添加错了但是当我运行 TaskHost 部分)
我不确定我还能尝试什么,我看到的信息表明我可能需要重新注册一些 .dll,但我没有管理员访问权限,我不想为某些事情经历麻烦不知道能不能用。
如有任何帮助,我们将不胜感激。
谢谢,
已修复,这是由于正在加载的 .DLL 版本不同所致。加载了旧版本,一切正常。