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

JSON 데이터 소스에서 수백만 개의 행을 .NET 응용 프로그램에 로드하는 방법 > 온라인 스터디

본문 바로가기

ComponentOne

온라인 스터디

일반 JSON 데이터 소스에서 수백만 개의 행을 .NET 응용 프로그램에 로드하는 방법

페이지 정보

작성자 GrapeCity 작성일 2022-11-08 09:30 조회 382회 댓글 0건

본문

ComponentOne DataConnectors는 ADO.NET 기반의 서비스 컴포넌트로 효율적인 데이터 커뮤니케이션을 위해 다양한 데이터 소스에 액세스할 수 있는 통합된 인터페이스를 제공합니다. 이는 데이터 기반 응용 프로그램을 개발하는 데 필요한 시간을 줄여줍니다. 요즘에는 응용 프로그램을 바인딩하는 데 JSON 데이터 소스를 점점 더 흔히 사용하고 있으며 GrapeCity에서는 ADO.NET 또는 EntityFramework Core를 사용하여 JSON 데이터에 쉽게 액세스할 수 있는 JSON용 DataConnector를 제공합니다. 이는 JSON 데이터 작업 프로세스를 간소화하며 플랫 및 관계형 JSON 데이터 모두를 쿼리하는 기능을 제공합니다.

일반적으로 JSON에 수많은 레코드가 있다면(예: 수백만 개) 반복하여 데이터를 할당하는 데 시간이 꽤 걸리지만 JSON DataConnector를 사용하면 수 초 내에 많은 데이터를 로드할 수 있으며 현재 이 기능은 최상위 문서 모델을 사용해서만 가능합니다.

이 블로그에서는 JSON용 ADO.NET Provider를 사용하여 수백만 개의 레코드를 FlexGrid에 매우 빠르게 로드하는 방법에 대해 알아볼 것이며 4백만 개의 레코드가 있는 직원의 데이터를 사용할 것입니다. 구현 단계는 다음과 같이 분류됩니다.

  1. 필수 패키지로 새 WinForms 응용 프로그램 설정

  2. JSON 데이터로 필드를 매핑하도록 사용자 정의 데이터 클래스 만들기

  3. JSON Datasource에 FlexGrid에 바인딩


아래 링크를 통해 지금 바로 ComponentOne을 다운로드한 후, 아래 내용을 따라해 보세요!


필수 패키지로 새 WinForms 응용 프로그램 설정

Visual Studio 2022를 사용하여 새 .NET 6 WinForms 응용 프로그램을 만들고 다음 패키지를 프로젝트에 추가합니다.

참고: 여기에서는 MaterialDark 테마를 적용하여 향상된 디자인을 제공하도록 FlexGrid의 C1Themes 클래스를 사용합니다.

응용 프로그램 설정 방법을 단계별로 표현하는 다음 스크린샷을 확인해주시기 바랍니다.


단계

img

1단계


img

2단계


img

3단계


img

4단계


img

5단계


img

6단계


JSON 데이터로 필드를 매핑하도록 사용자 정의 데이터 클래스 만들기

Data라는 새 사용자 정의 데이터 클래스를 만듭니다. 이는 JSON에서 스키마에 따라 INotifyPropertyChanged, IEditableObject 인터페이스를 구현하며 JSON 데이터 소스에서 강력한 형식이 지정된 레코드를 가져오도록 일반적인 클래스 C1AdoNetCursorDataCollection<class>에서 사용합니다.

internal class Data : INotifyPropertyChanged, IEditableObject
    {
        // Fields
        private string index;
        private string firstName;
        private string lastName;
        private bool isActive;
        private string salary;
        private string age;
        private string gender;
        private string company;
        private string email;
        private string phone;
        private string address;

        [DataMember(Name = "index")]
        public string Index
        {
            get => index;
            set
            {
                if (index != value)
                {
                    index = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "firstName")]
        public string FirstName
        {
            get => firstName;
            set
            {
                if (firstName != value)
                {
                    firstName = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "lastname")]
        public string Lastname
        {
            get => lastName;
            set
            {
                if (lastName != value)
                {
                    lastName = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "salary")]
        public string Salary
        {
            get => salary;
            set
            {
                if (salary != value)
                {
                    salary = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "age")]
        public string Age
        {
            get => age;
            set
            {
                if (age != value)
                {
                    age = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "gender")]
        public string Gender
        {
            get => gender;
            set
            {
                if (gender != value)
                {
                    gender = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "company")]
        public string Company
        {
            get => company;
            set
            {
                if (company != value)
                {
                    company = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "email")]
        public string Email
        {
            get => email;
            set
            {
                if (email != value)
                {
                    email = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "phone")]
        public string Phone
        {
            get => phone;
            set
            {
                if (phone != value)
                {
                    phone = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "address")]
        public string Address
        {
            get => address;
            set
            {
                if (address != value)
                {
                    address = value;
                    OnPropertyChanged();
                }
            }
        }

        [DataMember(Name = "isActive")]
        public bool IsActive
        {
            get => isActive;
            set
            {
                if (isActive != value)
                {
                    isActive = value;
                    OnPropertyChanged();
                }
            }
        }

        // INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        }

        protected void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChanged?.Invoke(this, e);

        }

        // IEditableObject Members
        private Data _clone;

        public void BeginEdit()
        {
            _clone = (Data)MemberwiseClone();
        }

        public void CancelEdit()
        {
            if (_clone != null)
            {
                foreach (var p in GetType().GetRuntimeProperties())
                {
                    if (p.CanRead && p.CanWrite)
                    {
                        p.SetValue(this, p.GetValue(_clone, null), null);
                    }
                }
            }
        }
        public void EndEdit()
        {
            _clone = null;
        }
    }


JSON Datasource에 FlexGrid에 바인딩

마지막 단계에서는 여기에서 제안된 대로 JSON 데이터와의 연결을 빌드하고 FlexGrid의 인스턴스에 바인딩하도록 C1DataCollectionBindingList에서 CursorDataCollection 객체를 래핑해야 합니다.

C1AdoNetCursorDataCollection<Data> dataCollection;
string documentConnectionString = $"Data Model=Document;Uri=" + @"..\..\..\4mData.json" + ";Json Path='$.employees';Max Page Size=1000";
var conn = new C1JsonConnection(documentConnectionString);
dataCollection = new C1AdoNetCursorDataCollection<Data>(conn, "employees");
await dataCollection.LoadMoreItemsAsync();


여기에서는 데이터를 로드하도록 LoadOnDemand 기능을 사용하므로 아래 제공된 대로 FlexGrid의 AfterScroll 이벤트를 처리하여 사용자가 마지막 표시 가능한 행으로 스크롤하는 즉시 데이터를 비동기적으로 로드해야 합니다.

c1FlexGrid1.AfterScroll += C1FlexGrid1_AfterScroll;
private void C1FlexGrid1_AfterScroll(object sender, C1.Win.FlexGrid.RangeEventArgs e)
{
  if (e.NewRange.BottomRow == c1FlexGrid1.Rows.Count - 1)
  {
    _ = dataCollection.LoadMoreItemsAsync();
  }
}


위에 제공된 모든 단계를 구현한 후 마지막 응용 프로그램은 아래 GIF에 표시된 대로 작동합니다.

스크롤


JSON용 ADO.NET Provider를 사용하여 대용량 데이터 응용 프로그램을 만드는 이 데모가 마음에 드셨으면 좋겠습니다. 샘플은 여기에서 다운로드할 수 있습니다.




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

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

댓글목록

등록된 댓글이 없습니다.

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

태그1

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