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

.NET 앱에서 ServiceNow를 연동 방법 > 온라인 스터디

본문 바로가기

ComponentOne

온라인 스터디

Winforms윈폼 .NET 앱에서 ServiceNow를 연동 방법

페이지 정보

작성자 GrapeCity 작성일 2022-06-10 13:33 조회 585회 댓글 0건

본문

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


이제 각 유형에 ADO.NET 공급자를 사용해 8가지 데이터 소스,

OData, Microsoft Dynamics 365 Sales, Salesforce Data, Kintone, QuickBooks Online, Google Analytics, JSON, ServiceNow에 연결할 수 있습니다.


이 공급자들은 SQL Server 및 OLEDB에 대한 기본 .NET 데이터 공급자와 동일한 ADO.NET 아키텍처를 보유하고 있습니다.


따라서 .NET 아키텍처에서 사용 가능한 유사한 클래스 집합을 따를 수 있게 함으로써 데이터 액세스 과정의 복잡성을 완화합니다.


또한 이 공급자들은 인증, 캐싱, SQL/LINQ 쿼리 지원과 같은 유용한 기능을 갖추고 있습니다. 이 기능 외에도 DataConnector에는 각 데이터 소스 유형에 대한 Entity Framework(EF) Core 공급자도 포함되어 있습니다.


이 공급자 덕분에 Entity Framework Core로 작업할 때도 이 라이브러리가 유용합니다.


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


NuGet


데스크톱 DataConnector 탐색기웹 기반 DataConnector 탐색기를 사용해 모든 유형의 DataConnector와 해당 기능에 대해 알아보실 수 있습니다.


또한 여기에서 ComponentOne DataConnectors 서비스 컴포넌트를 다운로드하여 설치할 수 있습니다.


설치된 샘플은 'C:\Users\xxxx\Documents\ComponentOne Samples\ServiceComponents\DataConnector'에서 확인하실 수 있습니다.



연결


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


DataConnector 서비스 라이브러리는 ADO.NET DataConnection 클래스와 동일한 C1ServiceNowConnection 클래스를 제공합니다.


이 클래스는 연결 개체를 만들어 연결 문자열을 클래스 구성자에 매개 변수로 전달함으로써 데이터에 대한 연결을 설정하는 데 사용됩니다. 연결 문자열은 C1ServiceNowConnectionStringBuilder 클래스를 사용해 미리 정의하거나 생성할 수 있습니다.


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

//Create connection string using C1ServiceNowConnectionStringBuilder
C1ServiceNowConnectionStringBuilder connBuilder = new C1ServiceNowConnectionStringBuilder();
connBuilder.Username = username;
connBuilder.Password = password;
connBuilder.OAuthClientId = oAuthCientId;
connBuilder.OAuthClientSecret = oAuthClientSecret;
connBuilder.OAuthTokenEndpoint = "https://dev63961.service-now.com/oauth_token.do";
connBuilder.Url = "https://dev63961.service-now.com/";

//Create and establish connection
C1ServiceNowConnection conn = new C1ServiceNowConnection(connBuilder);
conn.Open();
Console.WriteLine("Connection Estabished and opened !!!");



데이터 작업


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


공급자는 조인 쿼리, 함수, 요약 등 대부분의 SQL 기능을 지원합니다. 데이터 삽입, 업데이트, 삭제와 같은 기본적인 CRUD 작업은 C1ServiceNowCommandC1ServiceNowDataAdapter 개체를 사용하여 연결된 모드 또는 연결이 해제된 모드에서 수행할 수 있습니다.


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

//READ QUERY
using (C1ServiceNowConnection conn = new C1ServiceNowConnection(connectionString))
{
   //Populate DataTable              
   C1ServiceNowDataAdapter adapter = new C1ServiceNowDataAdapter(conn, "Select caller_id, category, description, close_code from incident");

   //Fill DataTable
   DataTable dataTable = new DataTable();
   var i = adapter.Fill(dataTable);
             
   if (i != -1)
  {
       //Display fetched data
       foreach (DataRow row in dataTable.Rows)
      {
          Console.WriteLine("CallerId:{0}", row["caller_id"]);
          Console.WriteLine("Category:{0}", row["category"]);                      
          Console.WriteLine("Description:{0}", row["description"]);
          Console.WriteLine("CloseCode:{0}", row["close_code"]);
          Console.WriteLine("\n");
      }
       Console.WriteLine("Read operation successful !!! \n \n");
    }
}


//INSERT QUERY
using (C1ServiceNowConnection conn = new C1ServiceNowConnection(connectionString))
{
   //Populate DataTable
   C1ServiceNowDataAdapter adapter = new C1ServiceNowDataAdapter(conn, "Select caller_id, category, description, close_code from incident");
   DataTable dataTable = new DataTable();
   adapter.Fill(dataTable);

   //Create Insert command
   adapter.InsertCommand = new C1ServiceNowCommand(conn);
   adapter.InsertCommand.CommandText = "Insert into incident(caller_id, category, description, close_code) Values(@caller_id,@category,@description,@close_code)";
   adapter.InsertCommand.Parameters.Add("@caller_id", "caller_id");
   adapter.InsertCommand.Parameters.Add("@category", "category");
   adapter.InsertCommand.Parameters.Add("@description", "description");
   adapter.InsertCommand.Parameters.Add("@close_code", "close_code");

   adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
               
   //Insert new row
   DataRow productRow = dataTable.NewRow();
   productRow["caller_id"] = "781ccaf9c0a8016400b98a06818d57d8";
   productRow["category"] = "inquiry";
   productRow["description"] = "I am unable to connect to the data server. It appears to be down.";
   productRow["close_code"] = "Solved (Permanently)";
   dataTable.Rows.Add(productRow);              

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


//UPDATE QUERY
using (C1ServiceNowConnection conn = new C1ServiceNowConnection(connectionString))
{
  //Populate DataTable
  C1ServiceNowDataAdapter adapter = new C1ServiceNowDataAdapter(conn, "Select caller_id, close_code from incident");
  DataTable dataTable = new DataTable();
  adapter.Fill(dataTable);

  //Create Update command              
  adapter.UpdateCommand = new C1ServiceNowCommand(conn);
  adapter.UpdateCommand.CommandText = "UPDATE incident SET close_code=@close_code where caller_id=@caller_id";
  adapter.UpdateCommand.Parameters.Add("@caller_id", "caller_id");
  adapter.UpdateCommand.Parameters.Add("@close_code", "close_code");

  adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;

  //Update existing row
  DataRow incidentRow = dataTable.Rows[0];
  incidentRow["close_code"] = "Solved Remotely (Permanently)";

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


//DELETE QUERY
using (C1ServiceNowConnection conn = new C1ServiceNowConnection(connectionString))
{
  //Populate Datatable
  C1ServiceNowDataAdapter adapter = new C1ServiceNowDataAdapter(conn, "Select caller_id, close_code from incident");
  DataTable dataTable = new DataTable();
  adapter.Fill(dataTable);

  //Create Delete command
  adapter.DeleteCommand = new C1ServiceNowCommand(conn);
  adapter.DeleteCommand.CommandText = "Delete from incident where caller_id = @caller_id";
  adapter.DeleteCommand.Parameters.Add("@caller_id", "caller_id");
  adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;

  //Delete a row
  DataRow productRow = dataTable.Rows[10];            
  productRow.Delete();

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


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


아래 샘플 코드 조각에서는 이와 동일한 것을 구현합니다.

단, FlexGrid 컨트롤이 디자이너를 사용해 Windows Form에 이미 추가되었다고 가정합니다.

private void Form1_Load(object sender, EventArgs e)
{          
   using (C1ServiceNowConnection conn = new C1ServiceNowConnection(GCServiceNowConnectionString))
  {
       //Populate DataTable              
       C1ServiceNowDataAdapter adapter = new C1ServiceNowDataAdapter(conn, "Select caller_id, category, description, close_code from incident");

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

       if (i != -1)
      {
           //Bind fetched data to FlexGrid
           c1FlexGrid1.DataSource = dataTable;

           //AutoSize columns to display data
           c1FlexGrid1.AutoSizeCols();
                   
           //Set backcolor for the alternate row
           c1FlexGrid1.Styles["Alternate"].BackColor = Color.LightGray;
        }
    }
}


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


가져온 데이터



일괄 업데이트


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


일괄 업데이트를 통해 서버에 대한 다중 요청을 방지함으로써 데이터 액세스 및 데이터 업데이트 작업의 전반적인 성능을 향상할 수 있습니다.


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


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

using (C1ServiceNowConnection conn = new C1ServiceNowConnection(connectionString))
{
   //Populate DataTable
   C1ServiceNowDataAdapter adapter = new C1ServiceNowDataAdapter(conn, "Select caller_id, close_code from incident");
   DataTable dataTable = new DataTable();
   adapter.Fill(dataTable);

   //Create Update command              
   adapter.UpdateCommand = new C1ServiceNowCommand(conn);
   adapter.UpdateCommand.CommandText = "UPDATE incident SET close_code=@close_code where caller_id=@caller_id";
   adapter.UpdateCommand.Parameters.Add("@caller_id", "caller_id");
   adapter.UpdateCommand.Parameters.Add("@close_code", "close_code");

   adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;

   //Update existing row
   DataRow incidentRow1 = dataTable.Rows[0];
   incidentRow1["close_code"] = "Solved Remotely (Permanently)";

   //Update existing row
   DataRow incidentRow2 = dataTable.Rows[1];
   incidentRow2["close_code"] = "Solved Remotely (Permanently)";

   //Set batch size to be updated
   adapter.UpdateBatchSize = 2;

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



캐싱


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


DataConnector 라이브러리는 이러한 유형의 기능을 지원하기 위해 캐싱 지원을 기본 제공합니다. 연결에 대해 캐시 속성을 설정하고 캐시를 지원하려면 연결 개체를 구성해야 합니다.


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


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


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

//Create connection string using C1ServiceNowConnectionStringBuilder
C1ServiceNowConnectionStringBuilder connBuilder = new C1ServiceNowConnectionStringBuilder();
connBuilder.Username = username;
connBuilder.Password = password;
connBuilder.OAuthClientId = oAuthClientId;
connBuilder.OAuthClientSecret = oAuthClientSecret;
connBuilder.OAuthTokenEndpoint = "https://dev63961.service-now.com/oauth_token.do";
connBuilder.Url = "https://dev63961.service-now.com/";
connBuilder.UseCache = true;
connBuilder.CacheTolerance = 500;
connBuilder.CacheLocation = @"C:\temp\sn_cache.db";

Console.WriteLine("Start Time " + DateTime.Now);
using (C1ServiceNowConnection conn = new C1ServiceNowConnection(connBuilder.ConnectionString))
{
   conn.Open();
   var cmd = conn.CreateCommand();
   cmd.CommandText = "SELECT * from incident";
   var rdr = cmd.ExecuteReader();
   while (rdr.Read())
  {
       Console.WriteLine(String.Format("\t{0} --> \t\t{1}-->\t\t\t{2}", rdr["caller_id"], rdr["category"], rdr["description"]));
  }
   Console.WriteLine("End Time " + DateTime.Now);
}



증분 캐싱


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


증분 캐싱은 캐시 데이터를 주기적으로 업데이트하여 전체 캐시 데이터를 갱신하지 않고 소스 엔터티에서 새 레코드를 추가합니다.


이 기술은 레코드가 마지막으로 업데이트되거나 새 레코드가 삽입된 시간을 기록하는 고유 필드와 타임스탬프 필드를 사용합니다.


증분 캐싱을 구현해야 하는 모든 표에는 타임스탬프 열이 있어야 하므로, ServiceNow에는 기본 타임스탬프 열인 "sys_updated_on."이 있습니다.


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


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


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




지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!

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

댓글목록

등록된 댓글이 없습니다.

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

태그1

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