0

一連の SharePoint リストから新しい Dynamics CRM 実装 (オンライン) にデータを移動する大規模な SSIS プロジェクトを作成中です。SSIS パッケージは、OData ソースを使用してリストからデータを取得します。

私のリストには、OData 呼び出しに表示されない列が 2 つあります。これらの 2 つの列には、複数選択または複数ルックアップの値があります。REST サービスは複数選択フィールドをサポートしていません。(別のスレッドで見つかりました:あなたが試みている方法は、複数選択ではない選択列でのみ機能します。残念ながら、複数選択選択列はRESTインターフェースではサポートされていません。明らかにSharePoint 2013にも同じことが当てはまります。)

したがって、OWSSVR.dll を使用して SharePoint リストのこれらの列のデータにアクセスする必要があります。使用しているブラウザによっては、リストに「このページを表示できません」または「このサイトにアクセスできません」と表示されます。

リスト設定から取得して、リスト ID を確認しました。うまくいかなかったので、移行済みの別の SharePoint リストに移動して、URL 形式を確認しました。もう 1 つのリストは機能し、データを XML 形式で返します。

OWSSVR.dll が複数選択値に対して同じ制限を持っているかどうか疑問に思っています。アイデアや提案はありますか?

擬似 URL (アクセス制限付きサイト):

動作: http://dummy.sharepointSite.Com/cases/_vti_bin/owssvr.dll?Cmd=Display&List= {b703d405-48c8-4211-9137-e1b50bdb0330}&XMLDATA=TRUE

壊れた: http://dummy.sharepointSite.Com/cases/_vti_bin/owssvr.dll?Cmd=Display&List= {8e148584-b5be-48f5-9343-85d23a7731cc}&XMLDATA=TRUE

4

1 に答える 1

0

OWSSVR を使用せずにこれを行う方法を考え出しました。ユーザー コンテキストを SharePoint サイトに設定してから、アイテムのリストを取得する必要があります。

方法:

public static ClientContext SetupSPContext(string documentLibrarySiteURL, 
                        string userName, string password, string domain = "")
{
    ClientContext clientContext = new ClientContext(documentLibrarySiteURL);
    SecureString pwString = new SecureString();

    foreach (char c in password.ToCharArray()) { pwString.AppendChar(c); }
    if (!String.IsNullOrWhiteSpace(domain))
        clientContext.Credentials = new NetworkCredential(userName, pwString, domain);
    else
        clientContext.Credentials = new SharePointOnlineCredentials(userName, pwString);

    Web web = clientContext.Web;
    clientContext.Load(web);
    clientContext.ExecuteQuery();
    return clientContext;
}

public static ListItemCollection GetListItems(ClientContext context, string listName)
{
    ListCollection listCollection = context.Web.Lists;
    List targetList = context.Web.Lists.GetByTitle(listName);

    CamlQuery query = new CamlQuery();
    query.ViewXml = "<Query><OrderBy><FieldRef Name='fieldName' /></OrderBy></Query>";
    ListItemCollection collListItem = targetList.GetItems(query);

    context.Load(collListItem);
    context.ExecuteQuery();

    if (collListItem.Count == 0)
    {
        return null;
    }
    else
    {
        return collListItem;
    }
}

SSIS スクリプト コンポーネントのコード:

//In the PreExecute method: 
//  Variables were defined for the class and not in the preExecute Method
ClientContext spContext = SetupSPContext(Variables.spLocation, Variables.spUserName, 
                                Variables.spPassword, Variables.spDomain);
ListItemCollection listItems = GetListItems(spContext, "List Name");

//Inside the Individual loop inside SSIS (Input0_ProcessInputRow):
ListItem listItem = GetListItem(listItems, fieldValue);

//Multiple Lookup Code
var values = (FieldLookupValue[])listItem["fieldName"];
var finalValue = "FieldName values:  ";

if (values.Length > 0)
{ 
    foreach (var value in values)
    {
        finalValue = value.LookupValue + "; ";
    }
}

//Multiple Select
if (listItem["fieldName2"] != null)
{
    var valuesTwo = (string[])listItem["fieldName2"];
    string combinedValues = "fieldName2 Values:  ";

    foreach (var value in valuesTwo)
    {
        combinedValues += value + "; ";
    }
}
于 2016-11-29T20:44:51.217 に答える