2017-08-08 57 views
0

我有一個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)數據流任務?

回答

0

先決條件

  • 下載從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方法來實際設置新列中的附件數據。
相關問題