目标:
Dynamics 365 CRM (Online)的WebAPI批量上传数据,一次修改100条记录
内容:
话不多讲,直接上如下代码,这里是新加字段把客户地址补上去
public async Task RunCleanContactData()
{
List<Contact> contacts = GetPatchContactData();
int batchCountOneTime = 0;
StringBuilder requestBoby = null;
int Content_ID = 0;
Guid batchId = Guid.Empty;
Guid changesetId = Guid.Empty;
string returnVal = string.Empty;
int a = contacts.Count;
for (int i = 0; i < contacts.Count; i++)
{
if (batchCountOneTime == 0)
{
batchId = Guid.NewGuid();
changesetId = Guid.NewGuid();
requestBoby = new StringBuilder();
requestBoby.Append($"--batch_{batchId.ToString()}");
requestBoby.Append("\n");
requestBoby.Append($"Content-Type:multipart/mixed;boundary=changeset_{changesetId.ToString()}");
requestBoby.Append("\n");
requestBoby.Append("\n");
}
batchCountOneTime++;
Content_ID = i + 1;
requestBoby.Append($"--changeset_{changesetId}");
requestBoby.Append("\n");
requestBoby.Append("Content-Type:application/http");
requestBoby.Append("\n");
requestBoby.Append("Content-Transfer-Encoding:binary");
requestBoby.Append("\n");
requestBoby.Append($"Content-ID: {Content_ID.ToString()}");
requestBoby.Append("\n");
requestBoby.Append("\n");
requestBoby.Append($"PATCH {OdataBaseUrl}contacts({contacts[i].contactid}) HTTP/1.1"); // Patch operation by using Guid
requestBoby.Append("\n");
requestBoby.Append("Content-Type:application/json;type=entry");
requestBoby.Append("\n");
requestBoby.Append("\n");
JObject job = new JObject();
job.Add("thk_address", (JToken)contacts[i].address);
requestBoby.Append(JsonConvert.SerializeObject(job));
requestBoby.Append("\n");
if (batchCountOneTime == 100)
{
returnVal = await crmHelper.SendBatchCrmRequest(requestBoby, batchId, changesetId);
a = a - batchCountOneTime;
batchCountOneTime = 0;
Content_ID = 0;
Console.WriteLine(returnVal);
}
else if (batchCountOneTime < 100 && a < 10)
{
returnVal = await crmHelper.SendBatchCrmRequest(requestBoby, batchId, changesetId);
a = a - batchCountOneTime;
Content_ID = 0;
batchCountOneTime = 0;
}
Console.WriteLine($"{a.ToString()} is remaing....");
}
}
private List<Contact> GetPatchContactData()
{
List<Contact> list = new List<Contact>();
string querysql = @"select * from Fei_T_Con";
DataTable dt = SqlHelper.ExecuteQuery(querysql);
if(dt.Rows.Count>0)
{
foreach (DataRow dr in dt.Rows)
{
Contact con = new Contact();
con.contactid = dr["contactid"].ToString();
// con.contactno = dr["contact_no"].ToString();
con.address = dr["contactAddress"].ToString();
list.Add(con);
}
}
return list;
}
private static HttpClient httpClient = null;
private HttpRequestMessage httpRequest = null;
private HttpResponseMessage httpResponse = null;
private JObject jobject = new JObject();
public CrmHelper(HttpClient _httpClient=null)
{
httpClient = _httpClient != null ? _httpClient : GlobalValues.GlobalValues.httpClient;
}
public async Task<string> SendBatchCrmRequest(StringBuilder RequestBody, Guid batchId, Guid changesetId, Boolean formatted = false)
{
string returnVal = null;
string OdataBaseUrl = GlobalValues.GlobalValues.UserInfo.ApiServiceUrl;
httpClient.DefaultRequestHeaders.Add("Prefer", "odata.include-annotations=\"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\"");
MultipartContent maincontent = new MultipartContent("mixed", $"batch_{batchId.ToString().Replace("\"", "")}");
StringContent sc = new StringContent(RequestBody.ToString());
sc.Headers.Clear();
sc.Headers.Add("Content-Type", $"multipart/mixed;boundary= { changesetId.ToString()}");
maincontent.Add(sc);
HttpResponseMessage httpResponse = await httpClient.PostAsync($"{ OdataBaseUrl}$batch", maincontent);
returnVal = await httpResponse.Content.ReadAsStringAsync();
return returnVal;
}
产出:
一共需补充70000多个客户的地址,如下效果