从Microsoft XRM SDK的IOrganizationService获取连接字符串并批量清理Microsoft Dynamics实例中的数据
从Microsoft XRM SDK的IOrganizationService获取连接字符串并批量清理Microsoft Dynamics实例中的数据
嘿,我来帮你搞定这个批量数据清理的事儿!既然你已经用XRM SDK连上Dynamics了,那咱们直接切入正题,顺便把连接相关的细节捋清楚。
一、先搞懂IOrganizationService的连接逻辑
你说的“获取连接字符串”,本质是用连接字符串初始化IOrganizationService实例对吧?通常咱们会这么操作:
- 用
CrmServiceClient创建连接,示例代码如下:
var connectionString = "AuthType=OAuth;Username=你的账号@域名.com;Password=你的密码;Url=https://你的组织.crm.dynamics.com/;AppId=51f81489-12ee-4a9e-aaae-a2591f45987d;RedirectUri=app://58145B91-0C36-4500-8554-080854F2AC97;LoginPrompt=Auto"; var serviceClient = new CrmServiceClient(connectionString); IOrganizationService service = serviceClient.OrganizationServiceProxy;
这里的连接字符串可以根据你的认证方式调整(比如AD、OAuth等),只要确保service实例能正常调用接口就行,这是后续操作的基础。
二、批量清理荷兰邮编的具体步骤
针对你说的邮编格式问题(统一转大写+去除空格),咱们分这几步来:
1. 批量拉取需要处理的记录
首先把所有带邮编的记录查出来,用QueryExpression就很方便,比如以联系人实体为例:
var query = new QueryExpression("contact") { ColumnSet = new ColumnSet("contactid", "address1_postalcode"), // 可以加筛选条件,比如只选邮编不为空的记录 Criteria = new FilterExpression { Conditions = { new ConditionExpression("address1_postalcode", ConditionOperator.NotNull) } } }; // 处理分页,避免超过Dynamics的查询行数限制 EntityCollection results; var pageNumber = 1; do { query.PageInfo = new PagingInfo { PageNumber = pageNumber, Count = 5000, // 每次拉5000条,可根据你的环境调整 PagingCookie = results?.PagingCookie }; results = service.RetrieveMultiple(query); // 处理当前页的记录 ProcessPostalCodes(results.Entities, service); pageNumber++; } while (results.MoreRecords);
2. 统一处理邮编格式
写个方法来批量格式化邮编:
private static void ProcessPostalCodes(List<Entity> entities, IOrganizationService service) { var updateRequests = new List<OrganizationRequest>(); foreach (var entity in entities) { var originalPostalCode = entity.GetAttributeValue<string>("address1_postalcode"); if (string.IsNullOrEmpty(originalPostalCode)) continue; // 清理规则:去掉所有空格+转大写 var cleanedPostalCode = originalPostalCode.Replace(" ", "").ToUpperInvariant(); // 只有内容变化时才添加更新请求,避免无效操作 if (cleanedPostalCode != originalPostalCode) { var updateRequest = new UpdateRequest { Target = new Entity(entity.LogicalName, entity.Id) { ["address1_postalcode"] = cleanedPostalCode } }; updateRequests.Add(updateRequest); } } // 批量提交更新,比逐个调用Update效率高太多 if (updateRequests.Any()) { var batchRequest = new ExecuteMultipleRequest { Requests = new OrganizationRequestCollection(updateRequests), Settings = new ExecuteMultipleSettings { ContinueOnError = true, // 某条失败不影响其他记录 ReturnResponses = true } }; var batchResponse = (ExecuteMultipleResponse)service.Execute(batchRequest); // 可以在这里记录失败的请求,方便后续排查 foreach (var response in batchResponse.Responses) { if (response.Fault != null) { Console.WriteLine($"更新失败,记录ID: {response.RequestId},错误原因: {response.Fault.Message}"); } } } }
3. 几个关键注意事项
- 测试优先:一定要先在测试环境跑一遍,确认逻辑没问题再碰生产数据!
- 扩展其他字段:如果还有其他需要清理的字段,比如姓名、地址等,只要在
QueryExpression里加上对应字段,然后在处理逻辑里添加对应的格式化规则就行。 - 权限检查:确保你的服务账号有对应实体的更新权限,不然会触发权限错误。
- 性能优化:数据量大的时候,一定要用
ExecuteMultipleRequest批量提交,避免频繁调用接口导致性能问题。
备注:内容来源于stack exchange,提问作者VDWWD
相关产品推荐
相关产品推荐

