행 상태 및 행 버전
ADO.NET에서는 행 상태 및 버전을 사용하여 테이블의 행을 관리합니다. 행 상태는 행의 상태를 나타내며, 행 버전에서는 현재 값, 원래 값 및 기본값 등과 같이 수정될 때 행에 저장된 값을 관리합니다. 예를 들어, 행에서 열을 수정한 경우 이 행의 상태는 Modified
가 되고 두 개의 행 버전이 존재하게 됩니다. 즉, Current
버전에는 현재의 행 값이 포함되고 Original
버전에는 열이 수정되기 전의 행 값이 포함됩니다.
각 DataRow 개체에는 RowState 속성이 있어서 사용자는 이 속성을 검사하여 행의 현재 상태를 결정합니다. 다음 표에서는 각 RowState
열거형 값에 대해 간략하게 설명합니다.
RowState 값 | 설명 |
---|---|
Unchanged | AcceptChanges 를 마지막으로 호출한 이후 또는 DataAdapter.Fill 에 의해서 행이 만들어진 이후로 변경된 내용이 없습니다. |
Added | 테이블에 행이 추가되었지만 AcceptChanges 가 호출되지 않았습니다. |
Modified | 일부 행 요소가 변경되었습니다. |
Deleted | 행이 테이블에서 삭제되었으며 AcceptChanges 가 호출되지 않았습니다. |
Detached | 행이 DataRowCollection 의 일부가 아닙니다. 새로 만든 행의 RowState 가 Detached 로 설정됩니다. DataRow 메서드를 호출하여 새 DataRowCollection 를 Add 에 추가한 후에는 RowState 속성 값이 Added 로 설정됩니다.Detached 메서드를 사용하거나 DataRowCollection 메서드를 사용한 후 Remove 메서드를 사용하여 Delete 에서 제거된 행에 대해서도 이 속성이 AcceptChanges 로 설정됩니다. |
AcceptChanges
, DataSet 또는 DataTable에 대해 DataRow가 호출되는 경우 행 상태가 Deleted
인 행은 모두 제거됩니다. 나머지 행의 상태는 Unchanged
로 지정되며 Original
행 버전의 값은 Current
행 버전의 값으로 덮어쓰여집니다. RejectChanges
가 호출되는 경우 행 상태가 Added
인 행은 모두 제거됩니다. 나머지 행의 상태는 Unchanged
로 지정되며 Current
행 버전의 값은 Original
행 버전의 값으로 덮어쓰여집니다.
다음 예제와 같이 열 참조와 함께 DataRowVersion 매개 변수를 전달하면 행의 다른 행 버전을 볼 수 있습니다.
Dim custRow As DataRow = custTable.Rows(0)
Dim custID As String = custRow("CustomerID", DataRowVersion.Original).ToString()
DataRow custRow = custTable.Rows[0];
string custID = custRow["CustomerID", DataRowVersion.Original].ToString();
다음 표에서는 각 DataRowVersion
열거형 값에 대해 간략하게 설명합니다.
DataRowVersion 값 | 설명 |
---|---|
Current | 행의 현재 값입니다. RowState 가 Deleted 인 행에는 이 행 버전이 존재하지 않습니다. |
Default | 특정 행에 대한 기본 행 버전입니다. Added , Modified 또는 Deleted 행의 기본 행 버전은 Current 이고, Detached 행의 기본 행 버전은 Proposed 입니다. |
Original | 행의 원래 값입니다. RowState 가 Added 인 행에는 이 행 버전이 존재하지 않습니다. |
Proposed | 행에 제안된 값입니다. 이 행 버전은 행에서 편집 작업을 수행하는 동안 존재하거나 DataRowCollection 의 일부가 아닌 행에 대해 존재합니다. |
DataRow
을 인수로 전달하여 HasVersion 메서드를 호출하면 DataRowVersion
에 특정 행 버전이 있는지 여부를 테스트할 수 있습니다. 예를 들어, DataRow.HasVersion(DataRowVersion.Original)
은 false
가 호출되기 전에 새로 추가된 행에 대해 AcceptChanges
를 반환합니다.
다음 코드 예제에서는 테이블에서 삭제된 모든 행의 값을 표시합니다. Deleted
행에는 Current
행 버전이 없으므로 해당 열 값에 액세스할 때는 DataRowVersion.Original
을 전달해야 합니다.
Dim catTable As DataTable = catDS.Tables("Categories")
Dim delRows() As DataRow = catTable.Select(Nothing, Nothing, DataViewRowState.Deleted)
Console.WriteLine("Deleted rows:" & vbCrLf)
Dim catCol As DataColumn
Dim delRow As DataRow
For Each catCol In catTable.Columns
Console.Write(catCol.ColumnName & vbTab)
Next
Console.WriteLine()
For Each delRow In delRows
For Each catCol In catTable.Columns
Console.Write(delRow(catCol, DataRowVersion.Original) & vbTab)
Next
Console.WriteLine()
Next
DataTable catTable = catDS.Tables["Categories"];
DataRow[] delRows = catTable.Select(null, null, DataViewRowState.Deleted);
Console.WriteLine("Deleted rows:\n");
foreach (DataColumn catCol in catTable.Columns)
Console.Write(catCol.ColumnName + "\t");
Console.WriteLine();
foreach (DataRow delRow in delRows)
{
foreach (DataColumn catCol in catTable.Columns)
Console.Write(delRow[catCol, DataRowVersion.Original] + "\t");
Console.WriteLine();
}