C# CRM Dynamics 2013如何使用ExecuteMultipleRequest从外部源更新多个记录

C# CRM Dynamics 2013如何使用ExecuteMultipleRequest从外部源更新多个记录,c#,sql,dynamics-crm-2013,C#,Sql,Dynamics Crm 2013,我在CRM中遇到一个场景,需要使用外部sql数据库表中的值更新多个帐户值(文本字段和选项集)。如何使用executemultiple请求来执行此操作。要求将CRM中的所有帐户数据与来自sql表的ERP数据同步。这个过程需要自动化,所以我选择使用每天运行的windows服务来更新外部sql表中ar标记为要更新的帐户。我正在努力找到解决这个问题的最佳方法,我在DEV上的一个控制台应用程序中测试了这个想法,下面是我的解决方案代码。我的问题是如何使用ExecuteMultipleRequest更好地做到

我在CRM中遇到一个场景,需要使用外部sql数据库表中的值更新多个帐户值(文本字段和选项集)。如何使用executemultiple请求来执行此操作。要求将CRM中的所有帐户数据与来自sql表的ERP数据同步。这个过程需要自动化,所以我选择使用每天运行的windows服务来更新外部sql表中ar标记为要更新的帐户。我正在努力找到解决这个问题的最佳方法,我在DEV上的一个控制台应用程序中测试了这个想法,下面是我的解决方案代码。我的问题是如何使用ExecuteMultipleRequest更好地做到这一点

public static void UpdateAllCRMAccountsWithEmbraceAccountStatus(IOrganizationService service, CRM_Embrace_IntegrationEntities3 db)
        {


            List<C_Tarsus_Account_Active_Seven__> crmAccountList = new List<C_Tarsus_Account_Active_Seven__>();

            //Here I get the list from Staging table
            var crmAccounts = db.C_Tarsus_Account_Active_Seven__.Select(x => x).ToList();



            foreach (var dbAccount in crmAccounts)
            {
                CRMDataObjectFour modelObject = new CRMDataObjectFour()
                {
                    ID = dbAccount.ID,
                    Account_No = dbAccount.Account_No,
                    Account_Name = dbAccount.Account_Name,
                    Account_Status = Int32.Parse(dbAccount.Account_Status.ToString()),
                    Country = dbAccount.Country,
                    Terms = dbAccount.Terms
                };
            }


            var officialDatabaseList = crmAccounts;

            //Here I query CRM to
            foreach (var crmAcc in officialDatabaseList)
            {
                QueryExpression qe = new QueryExpression();
                qe.EntityName = "account";
                qe.ColumnSet = new ColumnSet("accountnumber", "new_embraceaccountstatus");
                qe.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);
                qe.Criteria.AddCondition("accountnumber", ConditionOperator.NotIn, "List of acconts for example"


);

                EntityCollection response = service.RetrieveMultiple(qe);

                //Here I update the optionset value
                foreach (var acc in response.Entities)
                {
                    if (acc.Attributes["accountnumber"].ToString() == crmAcc.Account_No)
                    {
                        if (acc.Contains("new_embraceaccountstatus"))
                        {
                            continue;
                        }
                        else
                        {
                            acc.Attributes["new_embraceaccountstatus"] = new OptionSetValue(Int32.Parse(crmAcc.Account_Status.ToString()));
                        }
                        service.Update(acc);
                    }

                }
            }


        }
public static void UpdateAllCRMAccountsWithEmbraceAccountStatus(IOrganizationService服务,CRM拥抱集成实体3 db)
{
List crmAccountList=新列表();
//在这里,我从暂存表中获取列表
var crmAccounts=db.C_Tarsus_Account_Active_Seven_.Select(x=>x).ToList();
foreach(crmAccounts中的var dbAccount)
{
CRMDataObjectFour modelObject=新的CRMDataObjectFour()
{
ID=dbAccount.ID,
账号=dbAccount.Account账号,
Account\u Name=dbAccount.Account\u Name,
Account\u Status=Int32.Parse(dbAccount.Account\u Status.ToString()),
Country=dbAccount.Country,
术语=dbAccount.Terms
};
}
var officialDatabaseList=crmAccounts;
//这里我向CRM查询
foreach(officialDatabaseList中的变量crmAcc)
{
QueryExpression qe=新的QueryExpression();
qe.EntityName=“账户”;
qe.ColumnSet=新列集(“accountnumber”、“new_includeaccountstatus”);
qe.Criteria.AddCondition(“statecode”,ConditionOperator.Equal,0);
qe.Criteria.AddCondition(“accountnumber”,ConditionOperator.NotIn,“例如会计清单”
);
EntityCollection响应=service.RetrieveMultiple(qe);
//在这里,我更新optionset值
foreach(var acc响应实体)
{
if(acc.Attributes[“accountnumber”].ToString()==crmAcc.Account\u No)
{
如果(附件包含(“新状态”)
{
继续;
}
其他的
{
acc.Attributes[“new_includeaccountstatus”]=新选项setvalue(Int32.Parse(crmAcc.Account_Status.ToString());
}
服务更新(acc);
}
}
}
}

我知道这可能不是正确的方法,请告诉我如何使用ExecuteMultipleRequest,或者可能是一个完全不同的解决方案。

如果您现在需要了解如何执行
ExecuteMultipleRequest
MSDN上有示例

以下是我以前用来处理此问题的一些助手方法:

public static ExecuteMultipleRequest MultipleRequest { get; set; }
private const int BatchSize = 250;
public static long LastBatchTime { get; set; }

private static void Batch(IOrganizationService service, OrganizationRequest request)
{
    if (MultipleRequest.Requests.Count == BatchSize)
    {
        ExecuteBatch(service);
    }
    MultipleRequest.Requests.Add(request);
}

private static void ExecuteBatch(IOrganizationService service)
{
    if (!MultipleRequest.Requests.Any())
    {
        return;
    }
    Log("Executing Batch size {0}.  Last Batch was executed in {1}",MultipleRequest.Requests.Count, LastBatchTime);
    var watch = new System.Diagnostics.Stopwatch();
    watch.Start();
    var response = (ExecuteMultipleResponse)service.Execute(MultipleRequest);
    watch.Stop();
    LastBatchTime = watch.ElapsedMilliseconds;
    Log("Completed Executing Batch in " + watch.ElapsedMilliseconds);
    WriteLogsToConsole();


    var errors = new List<string>();
    // Display the results returned in the responses.
    foreach (var responseItem in response.Responses)
    {
        // A valid response.
        if (responseItem.Fault != null)
        {
            errors.Add(string.Format(
                "Error: Execute Multiple Response Fault.  Error Code: {0} Message {1} Trace Text: {2} Error Keys: {3} Error Values: {4} ",
                responseItem.Fault.ErrorCode,
                responseItem.Fault.Message,
                responseItem.Fault.TraceText,
                responseItem.Fault.ErrorDetails.Keys,
                responseItem.Fault.ErrorDetails.Values));
        }
    }
    MultipleRequest.Requests.Clear();
    if (errors.Any())
    {
        throw new Exception(string.Join(Environment.NewLine, errors));
    }
}
publicstaticexecutemultiplerequest MultipleRequest{get;set;}
private const int BatchSize=250;
公共静态long LastBatchTime{get;set;}
私有静态无效批处理(IOOrganizationService服务、OrganizationRequest请求)
{
if(MultipleRequest.Requests.Count==BatchSize)
{
执行包(服务);
}
MultipleRequest.Requests.Add(请求);
}
专用静态void ExecuteBatch(IOOrganizationService服务)
{
如果(!MultipleRequest.Requests.Any())
{
返回;
}
日志(“执行批大小{0}。上一批在{1}中执行”,MultipleRequest.Requests.Count,LastBatchTime);
var-watch=新系统.Diagnostics.Stopwatch();
watch.Start();
var response=(ExecuteMultipleResponse)service.Execute(MultipleRequest);
看,停;
LastBatchTime=watch.ElapsedMilliseconds;
日志(“在“+watch.elapsedmillesons”内完成执行批处理);
WriteLogsToConsole();
var errors=新列表();
//显示响应中返回的结果。
foreach(var responseItem in response.Responses)
{
//一个有效的回答。
if(responseItem.Fault!=null)
{
错误。添加(string.Format)(
“错误:执行多响应错误。错误代码:{0}消息{1}跟踪文本:{2}错误键:{3}错误值:{4}”,
responseItem.Fault.ErrorCode,
responseItem.Fault.Message,
responseItem.Fault.TraceText,
响应Item.Fault.ErrorDetails.Keys,
responseItem.Fault.ErrorDetails.Values);
}
}
MultipleRequest.Requests.Clear();
if(errors.Any())
{
抛出新异常(string.Join(Environment.NewLine,errors));
}
}
然后,您可以从您的常规逻辑中调用它,如下所示:

public static void UpdateAllCRMAccountsWithEmbraceAccountStatus(IOrganizationService service, CRM_Embrace_IntegrationEntities3 db)
{
    List<C_Tarsus_Account_Active_Seven__> crmAccountList = new List<C_Tarsus_Account_Active_Seven__>();

    //Here I get the list from Staging table
    var crmAccounts = db.C_Tarsus_Account_Active_Seven__.Select(x => x).ToList();

    foreach (var dbAccount in crmAccounts)
    {
        CRMDataObjectFour modelObject = new CRMDataObjectFour()
        {
            ID = dbAccount.ID,
            Account_No = dbAccount.Account_No,
            Account_Name = dbAccount.Account_Name,
            Account_Status = Int32.Parse(dbAccount.Account_Status.ToString()),
            Country = dbAccount.Country,
            Terms = dbAccount.Terms
        };
    }

    var officialDatabaseList = crmAccounts;

    //Here I query CRM to
    foreach (var crmAcc in officialDatabaseList)
    {
        QueryExpression qe = new QueryExpression();
        qe.EntityName = "account";
        qe.ColumnSet = new ColumnSet("accountnumber", "new_embraceaccountstatus");
        qe.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);
        qe.Criteria.AddCondition("accountnumber", ConditionOperator.NotIn, "List of acconts for example");

        EntityCollection response = service.RetrieveMultiple(qe);

        //Here I update the optionset value
        foreach (var acc in response.Entities)
        {
            if (acc.Attributes["accountnumber"].ToString() == crmAcc.Account_No)
            {
                if (acc.Contains("new_embraceaccountstatus"))
                {
                    continue;
                }
                else
                {
                    acc.Attributes["new_embraceaccountstatus"] = new OptionSetValue(Int32.Parse(crmAcc.Account_Status.ToString()));
                }
                Batch(service, new UpdateRequest { Target = acc });
            }

        }
    }

    // Call ExecuteBatch to ensure that any batched requests, get executed.
    ExeucteBatch(service)
}
public static void UpdateAllCRMAccountsWithEmbraceAccountStatus(IOrganizationService服务,CRM拥抱集成实体3 db)
{
List crmAccountList=新列表();
//在这里,我从暂存表中获取列表
var crmAccounts=db.C_Tarsus_Account_Active_Seven_.Select(x=>x).ToList();
foreach(crmAccounts中的var dbAccount)
{
CRMDataObjectFour modelObject=新的CRMDataObjectFour()
{
ID=dbAccount.ID,
账号=dbAccount.Account账号,
Account\u Name=dbAccount.Account\u Name,
Account\u Status=Int32.Parse(dbAccount.Account\u Status.ToString()),
Country=dbAccount.Country,
术语=dbAccount.Terms
};
}
var officialDatabaseList=crmAccounts;
//这里我向CRM查询
foreach(var crmAcc in