I’ve been experimenting with the classes created by Darren Terrell in the article “SalesForce integration with .net web services SOAP API” and found that there is a limit of 200 rows for upserts, so I’ve changed the Upsert() method as below to divide and submit the upserts in batches of 200 items at a time.
public UpsertResult[] Upsert(string externalID, sObject[] items) { SetupService(); // send in batches of 200 updates int iIndex = 0; List objResults = new List(items.Count()); while (iIndex < items.Count()) { sObject[] obj200Items = items.SubArray(iIndex, 200); objResults.AddRange( salesforceService.upsert(externalID, obj200Items) ); iIndex += 200; } return objResults.ToArray(); }
The SubArray method is defined as an extension below:
public static class ArrayExtensions { /// <summary> /// Extracts a subarray of a given number of items (count) from an array starting from a given position (startIndex) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="arr">Array from which to extract a subarray</param> /// <param name="startIndex">Position from where to obtain the array items</param> /// <param name="count">Number of items</param> /// <returns></returns> public static T[] SubArray(this T[] arr, int startIndex, int count) { var sub = new T[count]; int iActualCount = count; if( arr.Count() - startIndex < count ) iActualCount = arr.Count() - startIndex; Array.Copy(arr, startIndex, sub, 0, iActualCount); return sub; } }