ADO.NET을 사용해 QuickBooks Online 데이터를 통합하는 방법 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

ADO.NET을 사용해 QuickBooks Online 데이터를 통합하는 방법

페이지 정보

작성자 GrapeCity 작성일 21-04-09 15:29 조회 2,828회 댓글 0건

본문

ComponentOne 2020 v3 릴리스에서는 .NET Standard 서비스 라이브러리 DataConnectors(다양한 유형의 데이터 소스에 연결하는 데 사용할 수 있는 커넥터 집합을 제공)가 지원하는 데이터 소스의 수가 늘어납니다. 이제 각 유형에 ADO.NET Provider를 사용해 여섯 가지 데이터 소스, 즉 OData, Microsoft Dynamics 365 Sales, Salesforce Data, Kintone, QuickBooks OnlineGoogle Analytics에 연결할 수 있습니다.

이 Provider들은 SQL Server 및 OLEDB에 대한 기본 .NET 데이터 Provider와 동일한 ADO.NET 아키텍처를 보유하고 있습니다. 따라서 이 Provider들은 .NET 아키텍처에서 사용 가능한 유사한 클래스 집합을 따를 수 있게 함으로써 데이터 액세스 과정의 복잡성을 완화합니다. 또한 이 Provider들은 인증, 캐싱, SQL/LINQ 쿼리 지원과 같은 유용한 기능을 갖추고 있습니다.

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

이 블로그에서는 QuickBooks Online용 ADO.NET Provider를 사용해 QuickBooks Online 데이터에 연결하는 방법에 대한 이해를 돕고, 인증, 쿼리, 캐싱 등 기본적인 기능에 관해서도 설명합니다. 시작하려면 다음과 같이 NuGet에서 C1.DataConnectorC1.AdoNet.QuickBooksOnline 패키지를 설치해야 합니다.

ADO.NET을 사용해 QuickBooks Online 데이터 통합하기

데스크톱 DataConnector 탐색기웹 기반 DataConnector 탐색기를 사용해 모든 유형의 DataConnector와 그 기능에 대해 알아보실 수 있습니다. 여기에서 ComponentOne DataConnectors 서비스 컴포넌트를 다운로드하여 설치할 수도 있습니다. 설치된 샘플은 'C:\Users\xxxx\Documents\ComponentOne Samples\ServiceComponents\DataConnector'에서 확인하실 수 있습니다.


QuickBooks Online 데이터에 연결

Provider와의 작업을 위한 첫 단계는 QuickBooks Online 데이터에 대한 연결을 설정하는 것입니다. DataConnector 서비스 라이브러리는 ADO.NET DataConnection 클래스와 마찬가지로 C1QuickBooksOnlineConnection 클래스를 제공합니다. 이 클래스는 연결 개체를 만들어 연결 문자열을 클래스 구성자에 매개 변수로 전달함으로써 데이터에 대한 연결을 설정하는 데 사용됩니다. 연결 문자열은 C1QuickBooksOnlineConnectionStringBuilder 클래스를 사용해 미리 정의하거나 생성할 수 있습니다.

OAuthAccessToken, OAuthRefreshToken의 값은 브라우저를 사용해 이 절차에 따라 생성해야 합니다.

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

//Configure Connection string 
C1QuickBooksOnlineConnectionStringBuilder builder = new C1QuickBooksOnlineConnectionStringBuilder 
{ 
  OAuthClientId = OAuthClientId, 
  OAuthClientSecret = OAuthClientSecret, 
  OAuthTokenEndpoint = OAuthTokenEndpoint, 
  OAuthAccessToken = OAuthAccessToken, 
  OAuthRefreshToken = OAuthRefreshToken, 
  CompanyId = CompanyId, //RealmId is equivalent to CompanyId 
  UseSandbox = true 
}; 

private void Form1_Load(object sender, EventArgs e) 
{ 
  //Setup Connection
  LoadAuthentication(); 

  using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(builder.ConnectionString)) 
  { 
    //Handle the OAuthTokenRefreshed event to update the connection string 
    //with new tokens after the tokens have been refreshed. 
    conn.OAuthTokenRefreshed += OAuthTokenRefreshed; 

    //Perform CRUD operations 

    } 
  } 

  private static void LoadAuthentication() 
  { 
    try 
    { 
      var arrAuth = File.ReadAllText(@"Authentication.txt").Split(';'); 
      if (arrAuth[0] == CompanyId) 
    { 
      OAuthAccessToken = arrAuth[1]; 
      OAuthRefreshToken = arrAuth[2]; 
     } 
   } 
      catch { } 
    } 

    private static void OAuthTokenRefreshed(object sender, EventArgs e) 
    { 
      var conn = sender as C1QuickBooksOnlineConnection; 
      var strAuthen = $"{conn.CompanyId};{conn.OAuthToken.AccessToken};{conn.OAuthToken.RefreshToken}";
      File.WriteAllText(@"Authentication.txt", strAuthen); 
    } 


데이터 작업: 데이터 소스에 대한 쿼리

QuickBooks OnlineData용 ADO.NET Provider를 이용하면 표준 SQL 구문을 사용해 데이터 소스에 대해 쿼리할 수 있습니다. Provider는 쿼리 조인, 함수, 요약 등 대부분의 SQL 기능을 지원합니다.

데이터 삽입, 업데이트 및 삭제와 같은 기본적인 CRUD 작업은 C1QuickBooksOnlineCommandC1QuickBooksOnlineDataAdapter 개체를 사용해 온라인 또는 오프라인 상태에서 수행할 수 있습니다. 아래 샘플 코드에서는 C1QuickBooksOnlineDataAdapter 개체를 사용한 기본적인 CRUD 작업을 보여줍니다.

//READ QUERY
using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(connectionString)) 
{ 
  //Populate DataTable 
  C1QuickBooksOnlineDataAdapter adapter = new C1QuickBooksOnlineDataAdapter(conn, "Select Id, MetaData_CreateTime, MetaData_LastUpdatedTime, Category, Note from Attachables"); 

  //Fill DataTable
  DataTable dataTable = new DataTable(); 
  adapter.Fill(dataTable); 

  //Return DataTable 
  return dataTable; 
} 
//INSERT QUERY
using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(connectionString)) 
{ 
  //Populate DataTable 
  C1QuickBooksOnlineDataAdapter adapter = new C1QuickBooksOnlineDataAdapter(conn, "Select Id, MetaData_CreateTime, MetaData_LastUpdatedTime, Category, Note from Attachables"); 
  DataTable dataTable = new DataTable(); 
  adapter.Fill(dataTable); 

  //Create Insert command 
  adapter.InsertCommand = new C1QuickBooksOnlineCommand(conn); 
  adapter.InsertCommand.CommandText = "Insert into Attachables(Id, MetaData_CreateTime, MetaData_LastUpdatedTime, Note, Category) Values(@Note, @Category)"; 
  adapter.InsertCommand.Parameters.Add("@Note", "Note"); 
  adapter.InsertCommand.Parameters.Add("@Category", "Category"); 

  adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; 

  //Insert new row 
  DataRow customerRow = dataTable.NewRow(); 
  customerRow["Note"] = uniqueNote; 
  customerRow["Category"] = "Document"; 
  dataTable.Rows.Add(customerRow); 

  //Update database 
  adapter.Update(dataTable); 
} 
//UPDATE QUERY 
using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(connectionString)) 
{
  //Populate DataTable 
  C1QuickBooksOnlineDataAdapter adapter = new C1QuickBooksOnlineDataAdapter(conn, "Select Id, MetaData_CreateTime, MetaData_LastUpdatedTime, Category, Note from Attachables Where Category = 'Document'");
  DataTable dataTable = new DataTable(); 
  adapter.Fill(dataTable); 

  //Create Update command 
  adapter.UpdateCommand = new C1QuickBooksOnlineCommand(conn); 
  adapter.UpdateCommand.CommandText = "UPDATE Attachables SET Category = @Category WHERE Id = @Id"; 
  adapter.UpdateCommand.Parameters.Add("@Category", "Category"); 
  adapter.UpdateCommand.Parameters.Add("@Id", "Id"); 

  adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; 

  //Update existing row 
  DataRow customerRow = dataTable.Rows[0]; 
  customerRow["Category"] = "Signature"; 

  //Update database 
  adapter.Update(dataTable); 
} 
//DELETE QUERY 
using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(connectionString)) 
{ 
  //Populate Datatable 
  C1QuickBooksOnlineDataAdapter adapter = new C1QuickBooksOnlineDataAdapter(conn, $"Select Id, MetaData_CreateTime, MetaData_LastUpdatedTime, Category, Note from Attachables Where Note = '{uniqueNote}'"); 
  DataTable dataTable = new DataTable(); 
  adapter.Fill(dataTable); 

  //Create Delete command
  adapter.DeleteCommand = new C1QuickBooksOnlineCommand(conn); 
  adapter.DeleteCommand.CommandText = "Delete From Attachables Where Id = @Id"; 
  adapter.DeleteCommand.Parameters.Add("@Id", "Id"); 
  adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; 

  //Delete a row 
  DataRow customerRow = dataTable.Rows[0]; 
  customerRow.Delete(); 

  //Update Database 
  adapter.Update(dataTable); 
} 

이것은 QuickBooks Online에서 C1 QuickBooksOnline ADO.NET Provider를 사용해 데이터를 가져와 WinForms 응용 프로그램에서 FlexGrid에 바인딩하는 작업을 간단히 보여주는 예시입니다. 

아래 샘플 코드 조각에서는 이와 동일한 것을 구현합니다. 단, FlexGrid 컨트롤이 디자이너를 사용해 Windows Form에 이미 추가되었다고 가정합니다.

private void Form1_Load(object sender, EventArgs e) 
  { 
    LoadAuthentication(); 

    //Fetch Data 
    using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(connectionString)) 
    { 
      conn.OAuthTokenRefreshed += OAuthTokenRefreshed; 

      //Populate DataTable 
      C1QuickBooksOnlineDataAdapter adapter = new C1QuickBooksOnlineDataAdapter(conn, "Select Id, MetaData_CreateTime, MetaData_LastUpdatedTime, Category, Note from Attachables"); 

      //Fill DataTable 
      DataTable dataTable = new DataTable();
      adapter.Fill(dataTable); 

      //Bind fetched data to FlexGrid 
      c1FlexGrid1.DataSource = dataTable; 

      //AutoSize columns to display data 
      c1FlexGrid1.AutoSizeCols(); 
   } 
} 

아래 이미지는 가져온 데이터를 로드한 후 FlexGrid의 모습을 캡처한 것입니다. 

ADO.NET을 사용해 QuickBooks Online 데이터 통합하기


일괄 업데이트

QuickBooks Online용 ADO.NET Provider를 통해 DataSet 또는 DataTable에서 INSERT, UPDATE 및 DELETE 작업을 그룹화함으로써 일괄 처리를 지원할 수 있습니다. 일괄 업데이트를 통해 서버에 대한 다중 요청을 방지함으로써 데이터 액세스 및 데이터 업데이트 작업의 전반적인 성능을 향상할 수 있습니다.

명령이 지정된 크기의 배치로 그룹화되고 처리를 위해 서버로 전송되도록 UpdateBatchSize 속성을 적절한 값으로 설정해야 합니다.

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

using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(connectionString)) 
  { 
    //Populate DataTable 
    C1QuickBooksOnlineDataAdapter adapter = new C1QuickBooksOnlineDataAdapter(conn, "Select * from Attachables Where Category = 'Document'"); 
    DataTable dataTable = new DataTable(); 
    adapter.Fill(dataTable); 

    //Create Update command 
    adapter.UpdateCommand = new C1QuickBooksOnlineCommand(conn); 
    adapter.UpdateCommand.CommandText = "UPDATE Attachables SET Category = @Category WHERE Id = @Id"; 
    adapter.UpdateCommand.Parameters.Add("@Category", "Category"); 
    adapter.UpdateCommand.Parameters.Add("@Id", "Id"); 

    adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; 

    //Update existing rows 
    DataRow customerRow1 = dataTable.Rows[0]; 
    customerRow1["Category"] = "Signature"; 
    DataRow customerRow2 = dataTable.Rows[1]; 
    customerRow2["Category"] = "Signature"; 

    //Update database adapter.UpdateBatchSize = 2;
    adapter.Update(dataTable); 

    //Return DataTable 
    return dataTable; 
  } 


캐싱

사용자가 유사한 작업을 반복적으로 수행할 때 캐시에서 데이터에 액세스함으로써 QuickBooks Online용 ADO.NET Provider의 성능을 향상할 수 있습니다. DataConnector 라이브러리는 이러한 유형의 기능을 지원하기 위해 캐싱 지원을 기본 제공합니다. 연결에 대해 캐시 속성을 설정하고 캐시를 지원하려면 연결 개체를 구성해야 합니다.

UseCache 속성은 true로 설정해야 하지만, CacheLocation 속성을 설정해 기본 캐시 위치를 사용자 정의할 수 있습니다. CacheTolerance 속성은 캐시 허용 시간을 초 단위로 설정하는 데 사용됩니다(기본값은 600초로 설정됨).

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

//Configure Connection string 
  C1QuickBooksOnlineConnectionStringBuilder builder = new C1QuickBooksOnlineConnectionStringBuilder 
  { 
    OAuthClientId = OAuthClientId, 
    OAuthClientSecret = OAuthClientSecret, 
    OAuthTokenEndpoint = OAuthTokenEndpoint, 
    OAuthAccessToken = OAuthAccessToken, 
    OAuthRefreshToken = OAuthRefreshToken, 
    CompanyId = CompanyId, //RealmId is equivalent to CompanyId 
    UseSandbox = true 
    UseCache = true; 
    CacheTolerance = 500; 
    CacheLocation = @"C:\temp\c1cache.db"; 
  }; 

  using (C1QuickBooksOnlineConnection conn = new C1QuickBooksOnlineConnection(builder.ConnectionString)) 
  { 
    conn.OAuthTokenRefreshed += OAuthTokenRefreshed; 

    Console.WriteLine("Start Time " + DateTime.Now); 
    conn.Open(); 
    C1QuickBooksOnlineCommand cmd = new C1QuickBooksOnlineCommand(conn, "Select * from Attachables'"); 
    var rdr = cmd.ExecuteReader(); 
    while (rdr.Read()) 
    { 
      Console.WriteLine("Read and cached the row with Id " + rdr["Id"]); 
    } 
            Console.WriteLine("End Time " + DateTime.Now); 
  }


증분 캐싱

QuickBooks Online용 ADO.NET Provider는 증분 캐싱이라고 하는 또 다른 캐싱 전략을 제공합니다. 증분 캐싱은 캐시 데이터를 주기적으로 업데이트하여 전체 캐시 데이터를 갱신하지 않고 소스 엔터티에서 새 레코드를 추가합니다.

이 기술은 레코드가 마지막으로 업데이트되거나 새 레코드가 삽입된 시간을 기록하는 고유 필드 및 타임스탬프 필드를 사용합니다. 따라서 증분 캐싱을 구현해야 하는 모든 테이블에는 타임스탬프 열이 있어야 합니다. QuickBooks Online에는 "MetaData_LastUpdatedTime"이라는 기본 타임스탬프 열이 있습니다. C1QuickBooksOnlineConnectionStringBuilder 클래스의 "IncrementalUpdate""IncrementalUpdateColumn" 속성은 증분 캐싱을 지원하도록 설정해야 합니다. 자세한 내용은 증분 캐싱에 대한 문서 주제를 참조하십시오.

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

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


  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2022 GrapeCity inc.