다음을 통해 공유


행 상태 및 행 버전

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

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

RowState 값

설명

Unchanged

AcceptChanges를 마지막으로 호출한 이후 또는 DataAdapter.Fill에 의해서 행이 만들어진 이후로 변경된 내용이 없습니다.

Added

테이블에 행이 추가되었지만 AcceptChanges가 호출되지 않았습니다.

Modified

일부 행 요소가 변경되었습니다.

Deleted

행이 테이블에서 삭제되었으며 AcceptChanges가 호출되지 않았습니다.

Detached

행이 DataRowCollection의 일부가 아닙니다. 새로 만든 행의 RowState가 Detached로 설정됩니다. Add 메서드를 호출하여 새 DataRow를 DataRowCollection에 추가한 후에는 RowState 속성 값이 Added로 설정됩니다.

Remove 메서드를 사용하거나 Delete 메서드를 사용한 후 AcceptChanges 메서드를 사용하여 DataRowCollection에서 제거된 행에 대해서도 이 속성이 Detached로 설정됩니다.

DataSet, DataTable 또는 DataRow에 대해 AcceptChanges가 호출되는 경우 행 상태가 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 또는 Unchanged 행의 기본 행 버전은 Current이고, Deleted 행의 기본 행 버전은 Original이며, Detached 행의 기본 행 버전은 Proposed입니다.

Original

행의 원래 값입니다. RowState가 Added인 행에는 이 행 버전이 존재하지 않습니다.

Proposed

행에 제안된 값입니다. 이 행 버전은 행에서 편집 작업을 수행하는 동안 존재하거나 DataRowCollection의 일부가 아닌 행에 대해 존재합니다.

DataRowVersion을 인수로 전달하여 HasVersion 메서드를 호출하면 DataRow에 특정 행 버전이 있는지 여부를 테스트할 수 있습니다. 예를 들어, DataRow.HasVersion(DataRowVersion.Original)은 AcceptChanges가 호출되기 전에 새로 추가된 행에 대해 false를 반환합니다.

다음 코드 예제에서는 테이블에서 삭제된 모든 행의 값을 표시합니다. 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();
}

참고 항목

기타 리소스

DataTable에서 데이터 조작

DataSets, DataTables 및 DataViews(ADO.NET)

DataAdapters 및 DataReaders(ADO.NET)