首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SSIS将附件从SharePoint ListItems迁移到Server列

如何使用SSIS将附件从SharePoint ListItems迁移到Server列
EN

Stack Overflow用户
提问于 2017-08-08 17:37:26
回答 1查看 669关注 0票数 0

我有一个SharePoint列表,其中包含我想从SharePoint迁移到名为NewsArticle的Server数据库表中的新闻文章。该列表包括带有附件的项,这些附件需要进入使用NewsArticleAttachmentFILESTREAM表。

下面是我的SharePoint列表:

  • 家庭新闻
    • ID
    • 标题
    • 描述
    • 已创建

下面是我的Server数据库表:

  • NewsArticle
    • Id
    • Title
    • Description
    • Created

  • NewsArticleAttachment
    • Id
    • NewsArticleFK
    • Name
    • UniqueID (统一标识符,行向导)
    • File (var二进制(Max),FILESTREAM)

如何使用(SSIS)数据流任务来完成此任务?

EN

回答 1

Stack Overflow用户

发布于 2017-08-08 17:37:26

先决条件

  • 在SharePoint列表源适配器消失之前从CodePlex下载它。我还没有找到一个新的地点,他们将主办它。

对于数据流

  1. 添加指向“家庭新闻”列表的"SharePoint列表源“。
  2. 添加一个“条件拆分”,将检查是否有任何附件。
  3. 添加一个“查找”以根据Id列表的自然键从NewsArticle表中提取匹配的SharePoint列。对于NewsArticleFK列,我们将需要这个。在本例中,我们将使用Title列表的SharePoint列来匹配SQL表的Title列。
  4. 创建以下变量
    • SharePoint_Url:"http://mysharepoint.mydomain.com
    • SharePoint_Account_Domain:"mydomain.com“
    • SharePoint_Account_Username:“我的用户名”
    • SharePoint_Account_Password:“符号学”
    • SharePoint_List_Guid:"00000000-0000-0000-0000-000000000000“
    • SharePoint_List_ServiceUrl:"bin/Lists.asmx

  1. 添加一个“脚本组件”来实际从SharePoint中提取附件。
    1. 在“脚本”部分,将步骤4中的变量添加到"ReadOnlyVariables“列表中。
    2. 在"Input“选项卡上,从ID列表中选择SharePoint列,从NewsArticle表中选择Id列。
    3. 在“输入和输出”选项卡上添加一个名为“附件”的新输出。我们需要创建一个新的输出,因为我们可能有带有多个附件的新闻文章,这将允许我们从一个输入行创建多个输出行。下面是所需的列:
      1. UniqueID (DT_GUID)
      2. AttachmentFile (DT_IMAGE)
      3. FileName (DT_WSTR)
      4. NewsArticleId (DT_I4)

代码语言:javascript
复制
1. Go back to the "Script" tab and click the "Edit Script..." button.  See the code below for details.

代码语言:javascript
复制
//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;
代码语言:javascript
复制
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的服务引用。url应该与SharePoint_List_ServiceUrl变量相同。
  • 使用代码创建服务绑定,因为SSIS包实际上无法从创建的app.config加载。
  • 使用服务引用的实例来调用GetAttachmentCollection,从SharePoint中实际提取附件urls。
  • 使用WebClient从它们的urls下载附件。
  • 使用AddBlobData列上的AttachmentFile方法实际设置新列中的附件数据。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45574732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档