2011-06-11 111 views
3

我是SalesForce(3個月)的新手。使用.Net進行SalesForce大容量數據交易C#

到目前爲止,我已經能夠在C#中創建一個應用程序,我可以使用它來對SalesForce數據庫執行插入和更新操作。這些交易是一次一個。

不,我需要進行大規模交易。例如,一次更新數千條記錄。一個一個地做他們會很快讓我們在24小時內分配API調用。

我想利用可用的批量交易流程來減少API調用的數量。到目前爲止,我還沒有很好的編碼,也沒有找到任何這樣的文檔。

如果任何人可以提供一些通用的例子或引導我對這個問題的可靠文件,我將不勝感激。僅供參考,我需要用來執行更新和插入的數據來自位於AIX機器上的IBM Unidata數據庫。所以直接的Web服務通信並不是真正可行的。從Unidata獲取數據一直是我的頭痛。我已經解決了。現在SalesForce的大部分API是我頭痛的問題。

在此先感謝。

傑夫

回答

1

你不提你當前正在使用的API,但是使用肥皂或合夥企業的API,你可以寫在記錄時間到Salesforce 200。 (創建/更新/ upsert調用都需要一個SObjects數組)。

使用批量API,您可以一次發送數千行數據塊的數據。

你可以找到兩個API集here

1

的文檔(這是SOAP代碼雖然沒有Salesforce的「大宗原料藥」;注意不要將兩者混爲一談)

Mighy是下面的代碼提供有關如何進行批量插入的清晰見解。

/// 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); 
    } 
} 
1

已經給出的答案是一個好的開始;但是,您確定需要真正編寫使用批量API的自定義應用嗎? salesforce數據加載器是一個非常強大的工具,它包含一個命令行界面,可以使用「普通」或批量數據API。除非你需要將花式邏輯作爲插入/更新的一部分,或者某種更加實時/按需加載,否則數據加載器將比定製應用程序更好。

+0

同意,Bulk API不是世界上最容易使用的東西;如果沒有其他選擇,我只會走那條路。 (我認爲裝載程序使用批量API來處理這個問題。) – shelleybutterfly 2011-07-11 21:07:51

+1

它使用兩者之一;如果要將批量API用於選擇操作,則需要SFDC啓用特殊選項,但如果要插入大量行,則在數據加載器(「設置」屏幕中的單個複選框)中使用它非常棒。 – jkraybill 2011-07-11 23:55:07

1

請找到可幫助您使用c#和WSDL API將數據插入salesforce對象的小代碼。我堅持要在C#中編寫代碼。我在分配你可以使用你的方式後使用直接索引進行分配。

我使用| (管道標誌)。你可能會改變這個,也可能是<br>,\n等等(行和列中斷)

意味着你可以輸入你的HTML /文本文件中的N行。我編寫了程序,以便由我的設計師添加訂單,這些設計師將訂單放在其他網站上,並從電子商務網站獲取數據,並且無需銷售人員添加/查看訂單記錄的界面。我爲此創建了一個對象。並在對象中添加以下列。

您的建議受到歡迎。

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