使用.Net C#使用SalesForce执行批量数据事务#

时间:2011-06-11 22:42:24

标签: salesforce bulkinsert

我是SalesForce的新手(3个月)。

到目前为止,我已经能够在C#中创建一个应用程序,我可以用它来预先形成SalesForce数据库的插入和更新。这些交易是一次一个。

不,我需要进行大规模交易。例如,一次更新数千条记录。逐个执行这些操作会使我们每24小时快速完成分配的API调用。

我想利用可用的批量交易流程来减少API调用的数量。到目前为止,我没有太多运气编码,也没有找到任何此类文件。

如果有人可以提供一些通用的例子或引导我找到关于这个主题的可靠文档,我将非常感激。

仅供参考,我需要用来进行更新和插入的数据来自位于AIX机器上的IBM Unidata数据库。因此,直接的Web服务通信是不可能的。从Unidata获取数据一直是我的头疼。我已经解决了。现在,SalesForce的批量api是我的新头痛。

提前致谢。

杰夫

4 个答案:

答案 0 :(得分:1)

您没有提到您当前使用的API,但使用soap合作伙伴或企业API,您可以一次将记录写入salesforce 200。 (create / update / upsert调用都采用SObject数组)。

使用批量API,您可以一次以数千行的数据块发送数据。

您可以找到两组API here

的文档

答案 1 :(得分:1)

(这是SOAP代码,而不是Salesforce“Bulk API”;小心不要混淆两者)

Mighy be below code提供了有关如何进行批量插入的清晰见解。

/// Demonstrates how to create one or more Account records via the API  

public void CreateAccountSample()
{
    Account account1 = new Account();
    Account account2 = new Account();

    // Set some fields on the account1 object. Name field is not set  

    // so this record should fail as it is a required field.  

    account1.BillingCity = "Wichita";
    account1.BillingCountry = "US";
    account1.BillingState = "KA";
    account1.BillingStreet = "4322 Haystack Boulevard";
    account1.BillingPostalCode = "87901";

    // Set some fields on the account2 object  

    account2.Name = "Golden Straw";
    account2.BillingCity = "Oakland";
    account2.BillingCountry = "US";
    account2.BillingState = "CA";
    account2.BillingStreet = "666 Raiders Boulevard";
    account2.BillingPostalCode = "97502";

    // Create an array of SObjects to hold the accounts  

    sObject[] accounts = new sObject[2];
    // Add the accounts to the SObject array  

    accounts[0] = account1;
    accounts[1] = account2;

    // Invoke the create() call  

    try
    {
        SaveResult[] saveResults = binding.create(accounts);

        // Handle the results  

        for (int i = 0; i < saveResults.Length; i++)
        {
            // Determine whether create() succeeded or had errors  

            if (saveResults[i].success)
            {
                // No errors, so retrieve the Id created for this record  

                Console.WriteLine("An Account was created with Id: {0}",
                    saveResults[i].id);
            }
            else
            {
                Console.WriteLine("Item {0} had an error updating", i);

                // Handle the errors  

                foreach (Error error in saveResults[i].errors)
                {
                    Console.WriteLine("Error code is: {0}",
                        error.statusCode.ToString());
                    Console.WriteLine("Error message: {0}", error.message);
                }
            }
        }
    }
    catch (SoapException e)
    {
        Console.WriteLine(e.Code);
        Console.WriteLine(e.Message);
    }
}

答案 2 :(得分:1)

已经给出的答案是一个良好的开端;但是,您确定需要实际编写使用批量API的自定义应用吗? salesforce数据加载器是一个非常强大的工具,包括一个命令行界面,可以使用“普通”或批量数据API。除非您需要在插入/更新或某种更实时/按需加载中使用奇特的逻辑,否则数据加载器将是比自定义应用程序更好的选择。

答案 3 :(得分:1)

请找到可以帮助您使用c#和WSDL API将数据插入salesforce对象的小代码。我坚持用c#编写代码。我在吐痰后使用直接索引指定你可以使用你的方式。

我使用|拆分列(管道标志)。您可以更改此设置以及<br>\n等(行和列拆分)

表示您可以输入HTML /文本文件中的N行。我编写了程序来添加订单,我的设计师将订单放在其他网站上并从电子商务网站获取数据,并且没有任何界面供salesforce添加/查看订单记录。我创建了一个相同的对象。并在对象中添加以下列。

欢迎您提出建议。

private SforceService binding;                    // declare the salesforce servive using your access credential

try
                {
                    string stroppid = "111111111111111111";
                    System.Net.HttpWebRequest fr;
                    Uri targetUri = new Uri("http://abc.xyz.com/test.html");
                    fr = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(targetUri);
                    if ((fr.GetResponse().ContentLength > 0))
                    {

                        System.IO.StreamReader str = new System.IO.StreamReader(fr.GetResponse().GetResponseStream());
                        string allrow = str.ReadToEnd();
                        string  stringSeparators = "<br>";

                        string[] row1 = Regex.Split(allrow, stringSeparators);
                        CDI_Order_Data__c[] cord = new CDI_Order_Data__c[row1.Length - 1];

                        for (int i = 1; i < row1.Length-1; i++)
                        {
                            string colstr = row1[i].ToString();
                            string[] allcols = Regex.Split(colstr, "\\|");

                                cord[i] = new CDI_Order_Data__c(); // Very important to create object
                                cord[i].Opportunity_Job_Order__c = stroppid;
                                cord[i].jobid__c = stroppid;
                                cord[i].order__c = allcols[0].ToString();
                                cord[i].firstname__c = allcols[1].ToString();
                                cord[i].name__c = allcols[2].ToString();
                                DateTime dtDate = Convert.ToDateTime(allcols[3]);
                                cord[i].Date__c = new DateTime(Convert.ToInt32(dtDate.Year), Convert.ToInt32(dtDate.Month), Convert.ToInt32(dtDate.Day), 0, 0, 0); //sforcedate(allcols[3]); //XMLstringToDate(allcols[3]);
                                cord[i].clientpo__c = allcols[4].ToString();
                                cord[i].billaddr1__c = allcols[5].ToString();
                                cord[i].billaddr2__c = allcols[6].ToString(); 
                                cord[i].billcity__c = allcols[7].ToString(); 
                                cord[i].billstate__c = allcols[8].ToString(); 
                                cord[i].billzip__c = allcols[9].ToString();
                                cord[i].phone__c = allcols[10].ToString(); 
                                cord[i].fax__c = allcols[11].ToString();
                                cord[i].email__c = allcols[12].ToString(); 
                                cord[i].contact__c = allcols[13].ToString(); 
                                cord[i].lastname__c = allcols[15].ToString(); 
                                cord[i].Rep__c = allcols[16].ToString(); 
                                cord[i].sidemark__c = allcols[17].ToString(); 
                                cord[i].account__c = allcols[18].ToString(); 
                                cord[i].item__c = allcols[19].ToString(); 
                                cord[i].kmatid__c = allcols[20].ToString(); 
                                cord[i].qty__c = Convert.ToDouble(allcols[21]);
                                cord[i].Description__c = allcols[22].ToString();
                                cord[i].price__c = Convert.ToDouble(allcols[23]);
                                cord[i].installation__c = allcols[24].ToString(); 
                                cord[i].freight__c = allcols[25].ToString();
                                cord[i].discount__c = Convert.ToDouble(allcols[26]);
                                cord[i].salestax__c = Convert.ToDouble(allcols[27]);
                                cord[i].taxcode__c = allcols[28].ToString();
                        }
                        try {
                            SaveResult[] saveResults = binding.create(cord);

                      }
                      catch (Exception ce)
                      {
                            Response.Write("Buld order update errror" +ce.Message.ToString());
                            Response.End();
                      }

                       if (str != null) str.Close();
                   }