금백조의 개발 블로그

[C#]DataTable 변경 적용, 변경 이전 롤백 방법(AcceptChanges, RejectChanges) 본문

Programming Language/C#

[C#]DataTable 변경 적용, 변경 이전 롤백 방법(AcceptChanges, RejectChanges)

금백조 2021. 6. 22. 22:49
반응형

서론

 

애플리케이션 개발 중 특정 상황에서 DataTable 변경 체크 로직으로 인해 문제가 발생하여 Datatable의 변경된 정보를 다시 롤백해야 할 필요가 있었습니다. 해결책을 찾는 중 DataTable의 내장 함수인 RejectChanges를 알게 되어 문제를 해결했습니다. 오늘은 이 과정 속에서 알게 된 AcceptChanges, RejectChanges 사용법에 대해 정리하고자 글을 작성했습니다.

 


 

본론

 

[정의]

 

AcceptChanges : DataTable의 변경 내용을 커밋합니다.

RejectChanges : AcceptChanges() 호출한 이후에 수행된 모든 변경 내용을 롤백합니다.

 

[특징]

 

AcceptChanges()를 호출한 적이 없으면 RejectChanges() 호출 시 DataTable에서 수행되었던 모든 변경 내용이 롤백됩니다.

 

[예제]

 

DataRow 단위 + DataTable 단위 롤백

using System;
using System.Data;

namespace DataTableChangeRollbackExample
{
    class Program
    {
        static void Main(string[] args)
        {
            //사용자 데이터 테이블 usertable 생성 및 데이터 생성
            DataTable dt = new DataTable("usertable");
            DataColumn col1 = new DataColumn("id", Type.GetType("System.Int32"));
            col1.AutoIncrement = true;
            DataColumn col2 = new DataColumn("name", Type.GetType("System.String"));
            dt.Columns.Add(col1);
            dt.Columns.Add(col2);

            DataRow newRow;

            for (int i = 0; i < 10; i++)
            {
                newRow = dt.NewRow();
                newRow["name"] = "insert name " + i;
                dt.Rows.Add(newRow);
            }

            dt.AcceptChanges();//변경사항 적용

            //변경 이전 DataTable 출력
            Console.WriteLine("Change Before");
            printDatatable(dt);

            DataRowCollection itemColumns = dt.Rows;

            //7 인덱스 데이터 삭제, 8,9 인덱스 데이터 수정
            itemColumns[7].Delete();
            itemColumns[8]["name"] = "update name " + 8;
            itemColumns[9]["name"] = "update name " + 9;
            
            dt.AcceptChanges();//변경사항 적용

            //변경 이후 DataTable 출력
            Console.WriteLine("Change After");
            printDatatable(dt);

            ///0 인덱스 데이터 삭제, 1,2 인덱스 데이터 수정
            itemColumns[0].Delete();
            itemColumns[1]["name"] = "update name " + 1;
            itemColumns[2]["name"] = "update name " + 2;

            //DataRow 단위 Rollback
            //AcceptChanges()이전까지 작업 중 0 인덱스 데이터 삭제, 1 인덱스 데이터 수정을 rollback
            itemColumns[0].RejectChanges();
            itemColumns[1].RejectChanges();

            //Rollback된 DataTable 출력
            Console.WriteLine("DataRow Rollback");
            printDatatable(dt);

            //4,5,6 인덱스 데이터 update
            itemColumns[4]["name"] = "update name " + 5;
            itemColumns[5]["name"] = "update name " + 6;
            itemColumns[6]["name"] = "update name " + 7;

            //DataTable 단위 Rollback
            //AcceptChanges() 이전까지 전체 변경사항 Rollback
            dt.RejectChanges();

            //Rollback된 DataTable 출력
            Console.WriteLine("DataTable Rollback");
            printDatatable(dt);
        }

        static void printDatatable(DataTable table)
        {
            Console.WriteLine();
            foreach (DataRow row in table.Rows)
            {
                Console.WriteLine(row[0] + " " + row[1]);
            }
            Console.WriteLine();
        }
    }
}

 

[실행 결과]

 

 


 

결론

 

C#의 자료구조인 DataSet, DataTable, DataRow에는 AcceptChanges, RejectChanges 외에도 유용한 내장 함수들이 많이 있다고 생각합니다. 오늘 상황과 같이 기회가 될 때마다 하나씩 정리하여 글 쓰는 의지를 높여야겠습니다! 읽어주셔서 감사합니다!

 

Reference

 

[DataRow.RejectChanges 메서드]

https://docs.microsoft.com/ko-kr/dotnet/api/system.data.datarow.rejectchanges?view=net-5.0

 

DataRow.RejectChanges 메서드 (System.Data)

AcceptChanges()를 마지막으로 호출한 이후에 수행된 행의 모든 변경 내용을 취소합니다.Rejects all changes made to the row since AcceptChanges() was last called.

docs.microsoft.com

[DataTable.RejectChanges 메서드]

https://docs.microsoft.com/ko-kr/dotnet/api/system.data.datatable.rejectchanges?view=net-5.0

 

DataTable.RejectChanges 메서드 (System.Data)

테이블이 로드된 이후 또는 AcceptChanges()가 마지막으로 호출된 이후에 변경된 내용을 모두 롤백합니다.Rolls back all changes that have been made to the table since it was loaded, or the last time AcceptChanges() was called.

docs.microsoft.com

 

반응형