행 상태 및 행 버전

ADO.NET에서는 행 상태 및 버전을 사용하여 테이블의 행을 관리합니다. 행 상태는 행의 상태를 나타내며, 행 버전에서는 현재 값, 원래 값 및 기본값 등과 같이 수정될 때 행에 저장된 값을 관리합니다. 예를 들어, 행에서 열을 수정한 경우 이 행의 상태는 Modified가 되고 두 개의 행 버전이 존재하게 됩니다. 즉, Current 버전에는 현재의 행 값이 포함되고 Original 버전에는 열이 수정되기 전의 행 값이 포함됩니다.

DataRow 개체에는 RowState 속성이 있어서 사용자는 이 속성을 검사하여 행의 현재 상태를 결정합니다. 다음 표에서는 각 RowState 열거형 값에 대해 간략하게 설명합니다.

RowState 값 설명
Unchanged AcceptChanges를 마지막으로 호출한 이후 또는 DataAdapter.Fill에 의해서 행이 만들어진 이후로 변경된 내용이 없습니다.
Added 테이블에 행이 추가되었지만 AcceptChanges가 호출되지 않았습니다.
Modified 일부 행 요소가 변경되었습니다.
Deleted 행이 테이블에서 삭제되었으며 AcceptChanges가 호출되지 않았습니다.
Detached 행이 DataRowCollection의 일부가 아닙니다. 새로 만든 행의 RowStateDetached로 설정됩니다. DataRow 메서드를 호출하여 새 DataRowCollectionAdd에 추가한 후에는 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 행의 현재 값입니다. RowStateDeleted인 행에는 이 행 버전이 존재하지 않습니다.
Default 특정 행에 대한 기본 행 버전입니다. Added, Modified 또는 Deleted 행의 기본 행 버전은 Current이고, Detached 행의 기본 행 버전은 Proposed입니다.
Original 행의 원래 값입니다. RowStateAdded인 행에는 이 행 버전이 존재하지 않습니다.
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();  
}  

참고 항목