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;
}
}