SSIS脚本组件源 - 通过Odata从SharePoint 365列表中读取

时间:2016-08-14 22:01:07

标签: sharepoint ssis odata script-component

如果我的问题没有得到充分描述,我道歉。我是.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

0 个答案:

没有答案