使用 .Net 在数据流任务中按下映射
Pressing mappings in the Data Flow Task using .Net
几周前我问过这个问题:
现在我可以使用以下代码在 PowerShell 中加载包对象:
Add-Type -Path 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.ManagedDTS\v4.0_15.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ManagedDTS.dll';
$pkg = "C:\test.dtsx";
$app = New-Object -TypeName Microsoft.SqlServer.Dts.Runtime.Application
$app | Get-Member
$Package = $app.LoadPackage($pkg, $null, $FALSE)
$Package | Get-Member
$Package.Executables
$DataFlowTask = $Package.Executables | Where-Object {$_.('Description') -eq ("Data Flow Task")};
我的目标是刷新目标和源中数据流任务中的元数据(映射)。
我想在对象上调用这些方法,我认为这应该可以解决问题(参见此 Link)
instance.AcquireConnections(null);
instance.ReinitializeMetaData();
instance.ReleaseConnections();
但是我在上面创建的包对象中找不到数据流对象。包对象中数据流任务的“地址”是什么?
我不确定如何使用 PowerShell 完成此操作,但我会提供 C# 解决方案。
//loop over control flow tasks
foreach (DtsRuntime.Executable tsk in pkg.Executables)
{
DtsRuntime.TaskHost TH = (DtsRuntime.TaskHost)tsk
//Getting the data flow task object
if (TH.InnerObject.ToString() == "System.__ComObject")
{
try
{
DtsWrapper.MainPipe m = (DtsWrapper.MainPipe)TH.InnerObject;
DtsWrapper.IDTSComponentMetaDataCollection100 mdc = m.ComponentMetaDataCollection;
//loop over data flow task components
foreach (DtsWrapper.IDTSComponentMetaData100 md in mdc)
{
//get the OLE DB Destination component
if(md.ComponentClassID == app.PipelineComponentInfos["OLE DB Destination"].CreationName)
{
//add your code here
}
}
}
catch
{
}
}
}
此代码是从以下答案中提取和改进的:
我在 PowerShell 方面经验不多,但我会尽力提供一些有用的东西 links:
- Get-SsisMetadata.ps1
- How to create SSIS package with PowerShell? (这个 link 包含一个从 PowerShell 执行 C# 脚本的方法 - 它可能有帮助)
几周前我问过这个问题:
现在我可以使用以下代码在 PowerShell 中加载包对象:
Add-Type -Path 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.ManagedDTS\v4.0_15.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ManagedDTS.dll';
$pkg = "C:\test.dtsx";
$app = New-Object -TypeName Microsoft.SqlServer.Dts.Runtime.Application
$app | Get-Member
$Package = $app.LoadPackage($pkg, $null, $FALSE)
$Package | Get-Member
$Package.Executables
$DataFlowTask = $Package.Executables | Where-Object {$_.('Description') -eq ("Data Flow Task")};
我的目标是刷新目标和源中数据流任务中的元数据(映射)。
我想在对象上调用这些方法,我认为这应该可以解决问题(参见此 Link)
instance.AcquireConnections(null);
instance.ReinitializeMetaData();
instance.ReleaseConnections();
但是我在上面创建的包对象中找不到数据流对象。包对象中数据流任务的“地址”是什么?
我不确定如何使用 PowerShell 完成此操作,但我会提供 C# 解决方案。
//loop over control flow tasks
foreach (DtsRuntime.Executable tsk in pkg.Executables)
{
DtsRuntime.TaskHost TH = (DtsRuntime.TaskHost)tsk
//Getting the data flow task object
if (TH.InnerObject.ToString() == "System.__ComObject")
{
try
{
DtsWrapper.MainPipe m = (DtsWrapper.MainPipe)TH.InnerObject;
DtsWrapper.IDTSComponentMetaDataCollection100 mdc = m.ComponentMetaDataCollection;
//loop over data flow task components
foreach (DtsWrapper.IDTSComponentMetaData100 md in mdc)
{
//get the OLE DB Destination component
if(md.ComponentClassID == app.PipelineComponentInfos["OLE DB Destination"].CreationName)
{
//add your code here
}
}
}
catch
{
}
}
}
此代码是从以下答案中提取和改进的:
我在 PowerShell 方面经验不多,但我会尽力提供一些有用的东西 links:
- Get-SsisMetadata.ps1
- How to create SSIS package with PowerShell? (这个 link 包含一个从 PowerShell 执行 C# 脚本的方法 - 它可能有帮助)