如果我的问题没有得到充分描述,我道歉。我是.Net / C#/ SSIS新手。如果已经回答,也要道歉,我已经尝试在这里和Google搜索几个小时而没有运气。
背景:我需要从SharePoint 365列表中提取数据行,并将某些列取消转换为可以导入SQL Server表的格式。我意识到SSIS有一个Odata Source和内置的Unpivot组件,我已经成功地将它们用于概念验证。
但是,我认为我需要一个自定义脚本组件,因为要从源SharePoint列表中取消显示的列数是可变的。每个月左右,将添加一个新列(它与财务预测和#34;工具"在SharePoint中,以及最新预测的月份更改)。我的理解是源列必须在设计时在SSIS中定义,所以如果我的源列正在发生变化,我认为解决这个问题的唯一方法是每月手动更改SSIS数据流是以编程方式组合Odata源和unpivot函数到自定义脚本组件中。
我理解,或者可以弄明白,这是一种无法理解的逻辑。我正在努力解决的部分是如何实际连接并公开给定列表,并将它的数据行/列作为列表,我可以循环并执行映射到输出列。
我的"起点"请求指导是这样的: 1)使用标准SSIS Odata Connection Manager创建并成功连接到相关SharePoint网站。 2)在可视化设计器上创建标准"脚本组件",type = source。 3)从脚本组件属性中,将Odata连接管理器与名称" myConnection"相关联。 4)需要帮助 - >在脚本组件中,打开与特定列表的连接,读取其内容,然后执行unpivot逻辑。
出于说明目的,假设源是一个包含两个" fixed"的SharePoint列表。标题为Study and Site的字符串列,以及名称与月末日期匹配的可变数量的列(例如,2016年9月30日,2016年10月31日等),其中包含整数值。我想将研究和网站源列映射到同名的目标列,并取消将列名映射到ProjectionMonth的月份列,并将整数值映射到ProjectionValue。
这是我想到的基本算法(我意识到这不是可编译的 - 我需要你的帮助!):
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Data.SqlClient;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
IDTSConnectionManager100 connMgr;
SqlConnection sqlConn; // from MSDN tutorial, but I don't know how to adapt to Odata/SharePoint 365 list
SqlDataReader sqlReader; // not sure how to adapt
public override void AcquireConnections(object Transaction)
{
connMgr = this.Connections.myConnection;
sqlConn = (SqlConnection)connMgr.AcquireConnection(null); // This is from MSDN tutorial, but I don't know how to adapt to Odata
}
public override void PreExecute()
{
//Not sure how to adapt to odata to read specific SharePoint list
SqlCommand cmd = new SqlCommand("SELECT * FROM <some sharepoint list>", sqlConn);
sqlReader = cmd.ExecuteReader();
}
public override void PostExecute()
{
sqlReader.Close(); // Not sure how to adapt.
}
public override void CreateNewOutputRows()
{
string myStudy;
string mySite;
string myProjectionMonth;
string myProjectionValue;
// This is a rough representation of the logic needed.
// I realize that the actual code to access column values / names depends on the class(es) I need to use, but not sure what those classes are / how to access
foreach (myListRow in sqlConn.rows)
{
myStudy = myListRow.Columns["Study"].value;
mySite = myListRow.Columns["Site"].value;
foreach (myColumn in myListRow.Columns)
if (DateTime.TryParse(myColumn.Name, out dateValue))
{
myProjectionMonth = myColumn.Name;
myProjectionValue = myColumn.Value;
Output0Buffer.AddRow();
Output0Buffer.Study = myStudy;
Output0Buffer.Site = mySite;
Output0Buffer.ProjectionMonth = myProjectionMonth;
Output0Buffer.ProjectionValue = myProjectionValue;
}
}
}
}
编辑作为示例,假设源SharePoint列表具有以下内容:
Study Site 9/30/2016 10/31/2016
123 ABC 5 10
我希望脚本组件连接到列表,读取它的内容,并将以下不公开的数据集返回给SQL Server:
Study Site ProjectionMonth ProjectionValue
123 ABC 9/30/2016 5
123 ABC 10/31/2016 10