C#의 DataTable에서 행(Row)과 컬럼(Column)을 삭제하는 방법은 간단하다. 그러나 반복문(for)을 사용하여 행(Row)을 삭제할 때는 Remove 메소드를 사용할 경우 오류가 날 수 있으니 Delete 메소드를 활용하는 것이 편할 수 있다.
컬럼(Column) 삭제 방법
1. 컬럼 위치로 삭제
- DataTable.Columns.RemoveAt("컬럼순번")
DataTable dt = new DataTable();
// ..생략
dt.Columns.RemoveAt(3);
2. 컬럼 명으로 삭제
- DataTable.Columns.Remove("컬럼명")
DataTable dt = new DataTable();
// ..생략
dt.Columns.Remove("HIREDATE");
행(Row) 삭제 방법
1. 행 위치로 삭제
- DataTable.Rows.RemoveAt("행순번")
DataTable dt = new DataTable();
// ..생략
dt.Rows.RemoveAt(1);
2. DataRow 삭제
- DataTable.Rows.Remove(DataRow)
DataTable dt = new DataTable();
// ..생략
DataRow row = dt.Rows[1];
dt.Rows.Remove(row);
3. Delete 메소드로 삭제 (복구 가능, 반복문 사용시 편함)
- DataTable.Rows["행순번"].Delete()
- DataRow.Delete()
DataTable dt = new DataTable();
// ..생략
dt.Rows[2].Delete();
Delete() 메소드로 삭제한 경우 dt.AcceptChanges() 메소드를 호출하지 않았으면 dt.RejectChanges() 메소드를 호출하여 삭제한 행 데이터를 복구할 수 있다. 데이터는 삭제되었지만 해당 영역에 남아 있기 때문이다.
dt.AcceptChanges() // 커밋(Commit)과 같은 역할이다.
반복문에서 RemoveAt(), Remove() 메소드를 사용하여 행을 삭제할 경우 행의 순번이 바뀌기 때문에 오류가 발생하지만, Delete() 메소드를 사용하면 AcceptChanges() 함수 호출 전에는 순서가 바뀌지 않기 때문에 오류가 발생하지 않는다.
DataTable dt = new DataTable();
// ..생략
dt.AcceptChanges(); // 이전 변경 데이터 커밋
foreach (DataRow row in dt.Rows) {
if (row["NAME"].ToString() == "John") {
row.Delete();
}
}
dt.AcceptChanges(); // 삭제한 데이터 커밋
( 반복문에서 DataTable 행 삭제 시 Remove() 메소드를 사용할 경우 아래의 오류가 발생할 수 있다 )
System.InvalidOperationException: '컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다.' |