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