! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

ADO.NET을 사용해 Salesforce 데이터 통합 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

ADO.NET을 사용해 Salesforce 데이터 통합

페이지 정보

작성자 GrapeCity 작성일 2020-12-30 12:22 조회 4,334회 댓글 0건

본문

ComponentOne 2020 v2 릴리스에서는 .NET Standard 서비스 라이브러리 DataConnectors(다양한 유형의 데이터 소스에 연결할 수 있는 커넥터 집합을 제공)가 지원하는 데이터 소스의 수가 늘어납니다.


이제 각 유형에 ADO. NET 공급자를 사용해 네 가지 데이터 소스, 즉 OData, Microsoft Dynamics 365 Sales, Salesforce Data, Kintone에 연결할 수 있습니다.


이 공급자들은 SQL Server 및 OLEDB에 대한 기본 .NET 데이터 공급자로서 동일한 ADO.NET 아키텍처를 보유하고 있습니다. 따라서 이 공급자들은 .NET 아키텍처에서 사용 가능한 유사한 클래스 집합을 따를 수 있게 허용함으로써 데이터에 더 쉽게 액세스할 수 있게 합니다.


또한 이 공급자들은 인증, 캐싱, SQL/LINQ 쿼리 지원과 같은 유용한 기능을 갖추고 있습니다.


이 기능 외에도 DataConnector에는 각 데이터 소스 유형에 대한 Entity Framework(EF) Core 공급자도 포함되어 있습니다. 이 공급자 덕분에 Entity Framework Core로 작업할 때도 이 라이브러리가 유용합니다.


이 블로그에서는 Salesforce용 ADO. NET 공급자를 사용해 Salesforce 데이터에 연결하는 방법에 대한 이해를 돕고, 인증, 쿼리, 캐싱 등 기본적인 기능에 관해서도 설명합니다.


시작하려면 다음과 같이 NuGet에서 C1.DataConnectorC1.AdoNet.Salesforce 패키지를 설치해야 합니다.

ADO.NET을 사용하여 Salesforce 데이터 통합

여기에서 ComponentOne DataConnectors 서비스 컴포넌트를 다운로드하여 설치할 수도 있습니다. 설치된 샘플은 'C:\Users\xxxx\Documents\ComponentOne Samples\ServiceComponents\DataConnector'에서 확인하실 수 있습니다.


Salesforce 데이터에 대한 연결 설정


공급자와의 작업을 위한 첫 단계는 Salesforce 데이터에 대한 연결을 설정하는 것입니다.

DataConnector 서비스 라이브러리는 ADO. NET DataConnection 클래스와 동일한 C1SalesforceConnection 클래스를 제공합니다. 이 클래스는 연결 개체를 생성하여 데이터에 대한 연결을 설정하는 데 사용됩니다. 설정 후 연결 문자열을 클래스 구성자에게 매개 변수로 전달합니다.

연결 문자열은 C1SalesforceConnectionStringBuilder 클래스를 사용해 미리 정의하거나 생성할 수 있습니다.

아래 코드 조각에서는 연결 문자열을 생성하고 연결 개체를 만드는 방법을 보여줍니다.

//Configure Connection string
C1SalesforceConnectionStringBuilder builder = new C1SalesforceConnectionStringBuilder();
builder.Url = url;
builder.Username = username; 
builder.Password = password; 
builder.SecurityToken = securityToken; 
builder.OAuthClientId = clientId;
builder.OAuthClientSecret = clientSecret;
builder.OAuthTokenEndpoint = OAuthTokenEndpoint;
​
//Setup Connection 
C1SalesforceConnection conn = new C1SalesforceConnection(builder.ConnectionString);


인증을 사용한 보안 연결로 데이터에 액세스


여기에서는 Salesforce 데이터용 ADO. NET 공급자가 지원하는 OpenAuth 기반 인증이 보안 연결을 이용한 데이터 액세스에 어떤 도움이 되는지 알아보겠습니다.


OpenAuth는 개방형 표준 인증 프로토콜 또는 프레임워크로서, 서로 무관한 서버와 서비스가 초기의 관련 있는 단일 로그인 자격 증명을 공유하지 않고도 자산에 대한 인증된 액세스를 안전하게 허용하는 방법에 대해 기술합니다.


Salesforce용 ADO. NET 공급자는 보안 연결을 설정하기 위해 암호 자격 증명 또는 클라이언트 자격 증명 부여 유형을 지원합니다.


인증을 구현하려면 OAuthTokenEndPoint, OAuthAccessToken, OAuthRefreshToken, OAuthClientSecret, OAuthClientId, SecurityToken, Username, Password 속성에 적절한 값을 설정해야 합니다.


제공된 값 세트에 따라 라이브러리는 AccessToken/RefereshToken을 자동으로 생성 및 사용하여 보안 연결을 유지합니다.


아래 샘플 코드에서는 클라이언트 자격 증명 사용을 보여줍니다.

//Connection attribute values 
const string url = "https://ap16.salesforce.com/services/data/v42.0"; 
const string username = "*****"; 
const string password = "*****";
const string securityToken = "*****"; 
const string clientId = "*****"; 
const string clientSecret = "*****"; 
const string OAuthTokenEndpoint = "https://ap16.salesforce.com/services/oauth2/token";
​
//Configure Connection string 
C1SalesforceConnectionStringBuilder builder = new C1SalesforceConnectionStringBuilder(); 
builder.Url = url;
builder.Username = username;  
builder.Password = password;
builder.SecurityToken = securityToken; 
builder.OAuthClientId = clientId;  
builder.OAuthClientSecret = clientSecret;  
builder.OAuthTokenEndpoint = OAuthTokenEndpoint;
​
//Setup Connection
C1SalesforceConnection conn = new C1SalesforceConnection(builder.ConnectionString);


자세한 내용은 OAuth 인증이라는 상세 문서 주제를 참조하십시오.


데이터 소스에 쿼리하는 방법


Salesforce 데이터용 ADO. NET 공급자를 통해 표준 SQL 구문을 사용해 데이터 소스에 쿼리할 수 있습니다.


공급자는 쿼리 조인, 함수, 요약 등 대부분의 SQL 기능을 지원합니다. 삽입, 업데이트, 데이터 삭제와 같은 기본적인 CRUD 작업은 C1SalesforceCommandC1SalesforceDataAdapter 개체를 사용해 온라인 또는 오프라인 상태에서 수행할 수 있습니다.


아래 샘플 코드에서는 C1SalesforceDataAdapter 개체를 사용한 기본적인 CRUD 작업을 보여줍니다.

------------------------------------------------------------------------------------------------------------------ 
//READ QUERY 
using (C1SalesforceConnection con = new C1SalesforceConnection(GCSalesforceServerConnectionString))
{ 
​
//Populate DataTable 
C1SalesforceConnection conn = new C1SalesforceConnection(GCSalesforceServerConnectionString);
C1SalesforceDataAdapter adapter = new C1SalesforceDataAdapter(conn, "Select * from Customer__c limit 5");  
DataTable dataTable = new DataTable(); 
adapter.Fill(dataTable);
​
//Display fetched data  
foreach (DataRow row in dataTable.Rows) 
{  
  Console.WriteLine("{0}\t{1}", row["Customer_ID__c"], row["Phone__c"]);
} 
}
-------------------------------------------------------------------------------------------------------------------
​
------------------------------------------------------------------------------------------------------------------ 
//INSERT QUERY
using (C1SalesforceConnection conn = new C1SalesforceConnection(GCSalesforceServerConnectionString))<
{
​
//Populate DataTable  
C1SalesforceDataAdapter adapter = new C1SalesforceDataAdapter(conn, "Select * from Customer__c"); 
DataTable dataTable = new DataTable(); 
adapter.Fill(dataTable);
​
//Create Insert command  
adapter.InsertCommand = new C1SalesforceCommand(conn);   
adapter.InsertCommand.CommandText = @"Insert into Customer__c (Customer_ID__c, Phone__c) values (@CustomerId, @Phone)";                
adapter.InsertCommand.Parameters.Add("@CustomerId", "Customer_ID__c");
adapter.InsertCommand.Parameters.Add("@Phone", "Phone__c");           
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
​
//Insert new row 
DataRow customerRow = dataTable.NewRow(); 
customerRow["Customer_ID__c"] = "LAAR";
customerRow["Phone__c"] = "090-871265";                 
dataTable.Rows.Add(customerRow);
​
//Update database   
adapter.Update(dataTable);
}
-------------------------------------------------------------------------------------------------------------------
​
-------------------------------------------------------------------------------------------------------------------
//UPDATE QUERY
using (C1SalesforceConnection conn = new C1SalesforceConnection(GCSalesforceServerConnectionString))
{  
​
//Populate DataTable  
C1SalesforceDataAdapter adapter = new C1SalesforceDataAdapter(conn, "Select * from Customer__c");
DataTable dataTable = new DataTable();  
adapter.Fill(dataTable);
​
//Create Update command   
adapter.UpdateCommand = new C1SalesforceCommand(conn);  
adapter.UpdateCommand.CommandText = "UPDATE Customer__c SET Contact_Name__c=@ContactName where Customer_ID__c=@CustomerId";  
adapter.UpdateCommand.Parameters.Add("@ContactName", "Contact_Name__c");  
adapter.UpdateCommand.Parameters.Add("@CustomerId", "Customer_ID__c");                                 
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;                
​
//Update existing row 
DataRow customerRow = dataTable.Rows[0]; 
customerRow["Contact_Name__c"] = "Maria Anders";
​
//Update database 
adapter.Update(dataTable); 
} 
-------------------------------------------------------------------------------------------------------------------
​
------------------------------------------------------------------------------------------------------------------ 
//DELETE QUERY 
using (C1SalesforceConnection conn = new C1SalesforceConnection(GCSalesforceServerConnectionString))
{
​
//Populate Datatable 
C1SalesforceDataAdapter adapter = new C1SalesforceDataAdapter(conn, "Select * from Customer__c");
DataTable dataTable = new DataTable();   
adapter.Fill(dataTable);
​
//Create Delete command
adapter.DeleteCommand = new C1SalesforceCommand(conn); 
adapter.DeleteCommand.CommandText = "Delete from Customer__c where Customer_ID__c=@Id";   
adapter.DeleteCommand.Parameters.Add("@Id", "Customer_ID__c");  
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
​
//Delete a row
DataRow customerRow = dataTable.Rows[0];               
customerRow.Delete();
​
//Update Database
adapter.Update(dataTable);
}
-------------------------------------------------------------------------------------------------------------------



일괄 업데이트로 전반적인 성능 향상


Salesforce용 ADO. NET 공급자를 통해 DataSet 또는 DataTable에서 INSERT, UPDATE 및 DELETE 작업을 그룹화함으로써 일괄 처리를 지원할 수 있습니다.


일괄 업데이트를 통해 서버에 대한 다중 요청을 방지함으로써 데이터 액세스 및 데이터 업데이트 작업의 전반적인 성능을 향상할 수 있습니다. 명령이 지정된 크기의 배치로 그룹화되고 처리를 위해 서버로 전송되도록 UpdateBatchSize 속성을 적절한 값으로 설정해야 합니다.


아래 코드 조각에서는 UpdateBatchSize 속성을 설정하고 일괄 업데이트를 수행하는 방법을 보여줍니다.

using (C1SalesforceConnection conn = new C1SalesforceConnection(GCSalesforceServerConnectionString))  
{
​
//Populate Datatable              
C1SalesforceDataAdapter adapter = new C1SalesforceDataAdapter(conn, "Select * from Customer__c");
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
​
//Create Update Query
adapter.UpdateCommand = new C1SalesforceCommand(conn);
adapter.UpdateCommand.CommandText = "UPDATE Customer__c SET Contact_Name__c=@ContactName where Customer_ID__c=@CustomerId";//Update Query
adapter.UpdateCommand.Parameters.Add("@ContactName", "Contact_Name__c");
adapter.UpdateCommand.Parameters.Add("@CustomerId", "Customer_ID__c");
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
​
//Perform Update operation
DataRow customerRow1 = dataTable.Rows[0];
customerRow1["Contact_Name__c"] = "Antonio Moreno";
DataRow customerRow2 = dataTable.Rows[3];
customerRow2["Contact_Name__c"] = "Hanna Moos";
​
//Set batch size to be updated
adapter.UpdateBatchSize = 2;
​
//Update database
adapter.Update(dataTable); 
}


캐싱을 통한 성능 향상

사용자가 유사한 작업을 반복적으로 수행할 때 캐시에서 데이터에 액세스함으로써 Salesforce용 ADO. NET 공급자의 성능을 향상할 수 있습니다.

DataConnector 라이브러리는 이러한 유형의 기능을 지원하기 위해 기본 제공 캐싱 지원을 제공합니다.

UseCache 속성은 true로 설정해야 하지만, CacheLocation 속성을 설정해 기본 캐시 위치를 사용자 정의할 수 있습니다.

CacheTolerance 속성은 캐시 허용 시간을 초 단위로 설정하는 데 사용됩니다(기본값은 600초로 설정됨).

아래 샘플 코드 조각에서는 연결 개체에서 모든 캐시 속성을 설정함으로써 캐싱을 지원하는 방법을 보여줍니다.

//Connection attribute values 
const string url = "https://ap16.salesforce.com/services/data/v42.0";  
const string username = "preet@comptest.com"; 
const string password = "waheguruji03"; 
const string securityToken = "fSP4lEXHh6YE1r3j1MTGO57v";
const string clientId = "3MVG9n_HvETGhr3DQYdXMQ1Vzd6aMGUbnEH8GSm5UjoFKp4XACMTrO0CypxyjPUrxMWgdifi0eC334qzeYaVb";  
const string clientSecret = "FA80698B0899F2C6A4A4526540B939419FD224E57D7AEA29B2449B3E0D79402B"; 
const string OAuthTokenEndpoint = "https://ap16.salesforce.com/services/oauth2/token";
​
//Configure Connection string
C1SalesforceConnectionStringBuilder builder = new C1SalesforceConnectionStringBuilder();  
builder.Url = url;
builder.Username = username; 
builder.Password = password; 
builder.SecurityToken = securityToken; 
builder.OAuthClientId = clientId;
builder.OAuthClientSecret = clientSecret;
builder.OAuthTokenEndpoint = OAuthTokenEndpoint;
builder.UseCache = true;  
builder.CacheTolerance = 500; 
builder.CacheLocation = @"C:\temp\c1cache.db";
​
using (C1SalesforceConnection conn = new C1SalesforceConnection(builder.ConnectionString))
{
​
Console.WriteLine("Start Time" + DateTime.Now); 
conn.Open();
var cmd = conn.CreateCommand();  
cmd.CommandText = "Select * from Customer__c"; 
var rdr = cmd.ExecuteReader();
while (rdr.Read())  
{  
  Console.WriteLine(String.Format("{0}\t{1}\t{2}", rdr["Customer_ID__c"], rdr["Contact_Name__c"], rdr["Phone__c"]));  
}  
Console.WriteLine("End Time " + DateTime.Now); 
}


추가 캐싱 전략: 증분 캐싱


Salesforce용 ADO. NET 공급자는 증분 캐싱이라고 하는 또 하나의 캐싱 전략을 제공합니다.

이 전략은 캐시 데이터를 주기적으로 업데이트하여 전체 캐시 데이터를 갱신하지 않고 소스 엔터티에서 새 레코드를 추가합니다. 이 기술은 레코드가 마지막으로 업데이트되거나 새 레코드가 삽입된 시간을 기록하는 고유 필드 및 타임스탬프 필드를 사용합니다.


따라서 증분 캐싱을 구현해야 하는 모든 테이블에는 타임스탬프 열이 있어야 합니다.

Salesforce에는 "LastModifiedDate"라는 기본 타임스탬프 열이 있습니다.


C1SalesforceConnectionStringBuilder 클래스의 "IncrementalUpdate" 및 "IncrementalUpdateColumn" 속성은 증분 캐싱을 지원하도록 설정해야 합니다. 자세한 내용은 증분 캐싱에 대한 문서 주제를 참조하십시오.


결론: Salesforce 데이터 및 ADO. NET을 통한 발전 가속화

위 단계에서는 ADO. NET과 같이 알려진 데이터 액세스 기술에 기반을 둔 표준 인터페이스를 보유한 경우 새로운 유형의 데이터 소스에 연결하는 것이 얼마나 쉬운지 알 수 있었습니다. 그러면 이전 기술을 사용해 새로운 작업을 수행해 보겠습니다.

자세한 내용은 DataConnector 문서를 참조하시기 바랍니다.

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.