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();
}
}
}
哇,說說直觀的鑄造和對象名稱! – ProfK 2010-01-20 18:10:52