2009-09-19 49 views
2

我正試圖從一個將DB表導出到平面文件的SSIS包中生成一個列'start/length'spec文檔。從處理平面文件連接的ConnectionManager對象獲取Columns屬性時,我碰到了一堵磚牆。我能夠獲得Columns屬性,但我無法做任何事情,因爲我無法確定任何類型。如果我將它轉換爲DTSProperty,那麼對象上的屬性就會很少。如果我得到的財產爲object,我可以確定的是它是一個System.__ComObject在SSIS平面文件連接中列出列

如何檢索Columns屬性作爲有用的對象,希望是一個集合,我可以迭代?

示例代碼:

 DTSRT.Application dtap = new Application(); 
     DTSRT.Package pkg = dtap.LoadFromDtsServer(@"\MSDB\ExportSamples", "ERISIA", null); 
     DTSRT.ConnectionManager ffcn = pkg.Connections["DestinationConnectionFlatFile"]; 
     DtsProperty cols = ffcn.Properties["Columns"]; 

回答

1

UPDATE:好的答案下面好像它在這方面是不相關的(儘管在某種意義上仍然是有用的,所以我會離開它)。我沒有考慮到Flat File ConnectionManager具有可用的列,而不必通過具有輸出/輸入列的源/目標組件

Columns屬性的值(GetValue)應該轉換爲IDTSConnectionManagerFlatFileColumns100(如果使用SQL Server 2005 API,則爲90)

或者,將您的配置管理器的InnerObject強制轉換爲公開Columns屬性的IDTSConnectionManagerFlatFile100。

(這些接口可以Microsoft.SqlServer.Dts.Runtime.Wrapper找到)


不知道如何相關,這是你的情況下,如果你仍然需要這一點,但我只是做了一件相似的,所以我想我會分享:

下面的代碼將列出Excel 2007文件的所有列,通過構建一個即時的SSIS包(您需要引用Microsoft.SqlServer.DTSPipelineWrap,Microsoft .SqlServer.DTSRuntimeWrap,Microsoft.SQLServer.ManagedDTS和Microsoft.SqlServer.PipelineHost)。

據我所見,唯一的區別是你必須intergate你的加載包,以獲得DataFlow任務和相關的平面文件目標組件與其連接管理器(在我的情況下,我自己創建相關的對象)並獲取其輸入列而不是輸出列。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.SqlServer.Dts.Runtime; 
using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 

namespace SSISListColumns 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create package 
      Package package = new Package(); 

      // Create excel connection manager and set connection string 
      string fileName = "sampledata.xlsx"; 
      ConnectionManager connection = package.Connections.Add("EXCEL"); 
      connection.Properties["ConnectionString"].SetValue(connection, string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR=YES""", fileName)); 

      // Add Data Flow task 
      Executable e = package.Executables.Add("STOCK:PipelineTask"); 
      TaskHost thMainPipe = e as TaskHost; 
      MainPipe dataFlowTask = thMainPipe.InnerObject as MainPipe; 

      // Add Excel Source component 
      IDTSComponentMetaData100 component = dataFlowTask.ComponentMetaDataCollection.New(); 
      component.Name = "ExcelSource"; 
      component.ComponentClassID = "DTSAdapter.ExcelSource.2"; 

      // Set Excel Source properties (connection manager, access mode and sheet/rowset) 
      CManagedComponentWrapper instance = component.Instantiate(); 
      instance.ProvideComponentProperties(); 

      if (component.RuntimeConnectionCollection.Count > 0) 
      { 
       component.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.GetExtendedInterface(package.Connections[0]); 
       component.RuntimeConnectionCollection[0].ConnectionManagerID = package.Connections[0].ID; 
      } 
      instance.SetComponentProperty("AccessMode", 0); 
      instance.SetComponentProperty("OpenRowset", "Sheet1$"); 

      // Activate 
      instance.AcquireConnections(null); 
      instance.ReinitializeMetaData(); 
      instance.ReleaseConnections(); 

      // List output columns 
      var output = component.OutputCollection[0]; 
      foreach (IDTSOutputColumn100 column in output.OutputColumnCollection) 
      { 
       Console.WriteLine(column.Name); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 

+0

哇,說說直觀的鑄造和對象名稱! – ProfK 2010-01-20 18:10:52