如何将附件从SharePoint ListItems迁移到使用SSIS的SQL Server FILESTREAM列中

问题描述:

我有一个SharePoint列表,其中包含我想从SharePoint迁移出来并进入我自己的名为NewsArticle的SQL Server数据库表的新闻文章。该列表包含需要附加到表中的附件项目,该表格使用FILESTREAM如何将附件从SharePoint ListItems迁移到使用SSIS的SQL Server FILESTREAM列中

这里是我的SharePoint列表:

  • 首页 - 新闻
    • ID
    • 标题
    • 说明
    • 创建

这里是我的SQL Server数据库表:

  • NewsArticle
    • Id
    • Title
    • Description
    • Created
  • NewsArticleAttachment
    • Id
    • NewsArticleFK
    • Name
    • UniqueID(唯一标识符,ROWGUIDCOL)
    • File(VARBINARY(MAX)FILESTREAM)

我怎样才能做到这一点USI SQL Server集成服务(SSIS)数据流任务?

先决条件

  • 下载从CodePlex SharePoint列表源适配器它消失之前。我还没有找到他们将要托管它的新位置。

为数据流

  1. 添加 “SharePoint列表来源” 指向你的 “首页 - 新闻” 列表中。
  2. 添加一个“条件拆分”,将检查是否有任何附件。
  3. 根据SharePoint列表的自然键添加“查找”以从NewsArticle表中匹配Id列。 NewsArticleFK列将需要此。在这种情况下,我们将使用SharePoint列表的Title列来匹配SQL表的Title列。
  4. 创建以下变量
  5. 添加一个“脚本组件”实际从SharePoint下拉附件。
    1. 在“脚本”部分,将步骤4中的变量添加到“ReadOnlyVariables”列表中。
    2. 在“输入列”选项卡上,选择SharePoint列表中的ID列和NewsArticle表中的Id列。
    3. 在“输入和输出”选项卡上添加一个名为“附件”的新输出。我们需要创建一个新的输出,因为我们可能有多个附件的新闻文章,这将允许我们从一个输入行创建多个输出行。这里是列需要:
      1. 的UniqueID(DT_GUID)
      2. AttachmentFile(DT_IMAGE)
      3. 文件名(DT_WSTR)
      4. NewsArticleId(DT_I4)
    4. 回去的 “脚本” 选项卡然后单击“编辑脚本...”按钮。详情请参阅下面的代码。
//This is referring to a Service Reference that will need to be created 
using SC_be93317446654a518077a828ff747bd1.SharePointListsService; 
using System; 
using System.IO; 
using System.Net; 
using System.ServiceModel; 
using System.Xml; 
public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    BasicHttpBinding listsSoapBinding = new BasicHttpBinding(); 
    listsSoapBinding.Name = "ListsSoap"; 
    listsSoapBinding.Security.Mode = BasicHttpSecurityMode.Transport; 
    listsSoapBinding.Security.Transport.ClientCredentialType = 
    HttpClientCredentialType.Ntlm; 

    EndpointAddress listsSoapAddress = 
    new EndpointAddress(Variables.SharePointListServiceUrl); 

    ListsSoapClient listsSoapClient = 
    new ListsSoapClient(listsSoapBinding, listsSoapAddress); 

    XmlElement attachmentCollection = listsSoapClient.GetAttachmentCollection(
    Variables.SharePointListGuid, Row.ID.ToString()); 

    foreach(XmlNode node in attachmentCollection.ChildNodes) 
    { 
    using (WebClient client = new WebClient()) 
    { 
     AttachmentsBuffer.AddRow(); 

     CredentialCache credentialCache = new CredentialCache(); 
     credentialCache.Add(
      new Uri(Variables.SharePointUrl), 
      "NTLM", 
      new NetworkCredential(
      Variables.SharePointAccountUsername, 
      Variables.SharePointAccountPassword, 
      Variables.SharePointAccountDomain)); 
     client.Credentials = credentialCache; 

     string attachmentUrl = node.InnerText; 

     byte[] data = client.DownloadData(attachmentUrl); 

     AttachmentsBuffer.AttachmentFile.AddBlobData(data); 
     AttachmentsBuffer.FileName = Path.GetFileName(node.InnerText); 
     AttachmentsBuffer.NewsArticleId = Row.NewsArticleId; 
     AttachmentsBuffer.UniqueID = Guid.NewGuid(); 
    } 
    } 
} 

这里有两点需要注意有关代码:

  • 创建服务引用到SharePoint Lists.asmx。该网址应该与SharePoint_List_ServiceUrl变量相同。
  • 使用代码创建服务绑定,因为SSIS包实际上无法从创建的app.config加载。
  • 使用服务引用的实例调用GetAttachmentCollection实际从SharePoint中提取附件URL。使用WebClient从他们的url下载附件。
  • AttachmentFile列上使用AddBlobData方法来实际设置新列中的附件数据。