행 상태 및 행 버전Row States and Row Versions

ADO.NET에서는 행 상태 및 버전을 사용하여 테이블의 행을 관리합니다.ADO.NET manages rows in tables using row states and versions. 행 상태는 행의 상태를 나타내며, 행 버전에서는 현재 값, 원래 값 및 기본값 등과 같이 수정될 때 행에 저장된 값을 관리합니다.A row state indicates the status of a row; row versions maintain the values stored in a row as it is modified, including current, original, and default values. 예를 들어, 행에서 열을 수정한 경우 이 행의 상태는 Modified가 되고 두 개의 행 버전이 존재하게 됩니다. 즉, Current 버전에는 현재의 행 값이 포함되고 Original 버전에는 열이 수정되기 전의 행 값이 포함됩니다.For example, after you have made a modification to a column in a row, the row will have a row state of Modified, and two row versions: Current, which contains the current row values, and Original, which contains the row values before the column was modified.

DataRow 개체에는 RowState 속성이 있어서 사용자는 이 속성을 검사하여 행의 현재 상태를 결정합니다.Each DataRow object has a RowState property that you can examine to determine the current state of the row. 다음 표에서는 각 RowState 열거형 값에 대해 간략하게 설명합니다.The following table gives a brief description of each RowState enumeration value.

RowState 값RowState value 설명Description
Unchanged AcceptChanges를 마지막으로 호출한 이후 또는 DataAdapter.Fill에 의해서 행이 만들어진 이후로 변경된 내용이 없습니다.No changes have been made since the last call to AcceptChanges or since the row was created by DataAdapter.Fill.
Added 테이블에 행이 추가되었지만 AcceptChanges가 호출되지 않았습니다.The row has been added to the table, but AcceptChanges has not been called.
Modified 일부 행 요소가 변경되었습니다.Some element of the row has been changed.
Deleted 행이 테이블에서 삭제되었으며 AcceptChanges가 호출되지 않았습니다.The row has been deleted from a table, and AcceptChanges has not been called.
Detached 행이 DataRowCollection의 일부가 아닙니다.The row is not part of any DataRowCollection. 새로 만든 행의 RowStateDetached로 설정됩니다.The RowState of a newly created row is set to Detached. DataRow 메서드를 호출하여 새 DataRowCollectionAdd에 추가한 후에는 RowState 속성 값이 Added로 설정됩니다.After the new DataRow is added to the DataRowCollection by calling the Add method, the value of the RowState property is set to Added.

Detached 메서드를 사용하거나 DataRowCollection 메서드를 사용한 후 Remove 메서드를 사용하여 Delete에서 제거된 행에 대해서도 이 속성이 AcceptChanges로 설정됩니다.Detached is also set for a row that has been removed from a DataRowCollection using the Remove method, or by the Delete method followed by the AcceptChanges method.

AcceptChanges, DataSet 또는 DataTable에 대해 DataRow가 호출되는 경우 행 상태가 Deleted인 행은 모두 제거됩니다.When AcceptChanges is called on a DataSet, DataTable , or DataRow, all rows with a row state of Deleted are removed. 나머지 행의 상태는 Unchanged로 지정되며 Original 행 버전의 값은 Current 행 버전의 값으로 덮어쓰여집니다.The remaining rows are given a row state of Unchanged, and the values in the Original row version are overwritten with the Current row version values. RejectChanges가 호출되는 경우 행 상태가 Added인 행은 모두 제거됩니다.When RejectChanges is called, all rows with a row state of Added are removed. 나머지 행의 상태는 Unchanged로 지정되며 Current 행 버전의 값은 Original 행 버전의 값으로 덮어쓰여집니다.The remaining rows are given a row state of Unchanged, and the values in the Current row version are overwritten with the Original row version values.

다음 예제와 같이 열 참조와 함께 DataRowVersion 매개 변수를 전달하면 행의 다른 행 버전을 볼 수 있습니다.You can view the different row versions of a row by passing a DataRowVersion parameter with the column reference, as shown in the following example.

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 열거형 값에 대해 간략하게 설명합니다.The following table gives a brief description of each DataRowVersion enumeration value.

DataRowVersion 값DataRowVersion value 설명Description
Current 행의 현재 값입니다.The current values for the row. RowStateDeleted인 행에는 이 행 버전이 존재하지 않습니다.This row version does not exist for rows with a RowState of Deleted.
Default 특정 행에 대한 기본 행 버전입니다.The default row version for a particular row. Added, Modified 또는 Deleted 행의 기본 행 버전은 Current이고,The default row version for an Added, Modified, or Deleted row is Current. Detached 행의 기본 행 버전은 Proposed입니다.The default row version for a Detached row is Proposed.
Original 행의 원래 값입니다.The original values for the row. RowStateAdded인 행에는 이 행 버전이 존재하지 않습니다.This row version does not exist for rows with a RowState of Added.
Proposed 행에 제안된 값입니다.The proposed values for the row. 이 행 버전은 행에서 편집 작업을 수행하는 동안 존재하거나 DataRowCollection의 일부가 아닌 행에 대해 존재합니다.This row version exists during an edit operation on a row, or for a row that is not part of a DataRowCollection.

DataRow을 인수로 전달하여 HasVersion 메서드를 호출하면 DataRowVersion에 특정 행 버전이 있는지 여부를 테스트할 수 있습니다.You can test whether a DataRow has a particular row version by calling the HasVersion method and passing a DataRowVersion as an argument. 예를 들어, DataRow.HasVersion(DataRowVersion.Original)false가 호출되기 전에 새로 추가된 행에 대해 AcceptChanges를 반환합니다.For example, DataRow.HasVersion(DataRowVersion.Original) will return false for newly added rows before AcceptChanges has been called.

다음 코드 예제에서는 테이블에서 삭제된 모든 행의 값을 표시합니다.The following code example displays the values in all the deleted rows of a table. Deleted 행에는 Current 행 버전이 없으므로 해당 열 값에 액세스할 때는 DataRowVersion.Original을 전달해야 합니다.Deleted rows do not have a Current row version, so you must pass DataRowVersion.Original when accessing the column values.

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();  
}  

참고자료See also