如何将附件从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列表源适配器它消失之前。我还没有找到他们将要托管它的新位置。
为数据流
- 添加 “SharePoint列表来源” 指向你的 “首页 - 新闻” 列表中。
- 添加一个“条件拆分”,将检查是否有任何附件。
- 根据SharePoint列表的自然键添加“查找”以从
NewsArticle
表中匹配Id
列。NewsArticleFK
列将需要此。在这种情况下,我们将使用SharePoint列表的Title
列来匹配SQL表的Title
列。 - 创建以下变量
- SharePoint_Url: “http://mysharepoint.mydomain.com”
- SharePoint_Account_Domain: “mydomain.com”
- SharePoint_Account_Username: “名为myUsername”
- SharePoint_Account_Password: “输入mypassword”
- SharePoint_List_Guid:“00000000 -0000-0000-0000-000000000000“
- SharePoint_List_ServiceUrl:”http://mysharepoint.mydomain.com/_vti_bin/Lists.asmx“
- 添加一个“脚本组件”实际从SharePoint下拉附件。
- 在“脚本”部分,将步骤4中的变量添加到“ReadOnlyVariables”列表中。
- 在“输入列”选项卡上,选择SharePoint列表中的
ID
列和NewsArticle
表中的Id
列。 - 在“输入和输出”选项卡上添加一个名为“附件”的新输出。我们需要创建一个新的输出,因为我们可能有多个附件的新闻文章,这将允许我们从一个输入行创建多个输出行。这里是列需要:
- 的UniqueID(DT_GUID)
- AttachmentFile(DT_IMAGE)
- 文件名(DT_WSTR)
- NewsArticleId(DT_I4)
- 回去的 “脚本” 选项卡然后单击“编辑脚本...”按钮。详情请参阅下面的代码。
//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
方法来实际设置新列中的附件数据。