Stavy řádků a verze řádků

ADO.NET spravuje řádky v tabulkách pomocí stavů řádků a verzí. Stav řádku označuje stav řádku; Verze řádků udržují hodnoty uložené v řádku při úpravě, včetně aktuálních, původních a výchozích hodnot. Například po provedení změny sloupce v řádku bude mít řádek stav Modifiedřádku a dvě verze řádků: Current, který obsahuje hodnoty aktuálního řádku a Originalkterý obsahuje hodnoty řádků před úpravou sloupce.

Každý DataRow objekt má RowState vlastnost, kterou můžete prozkoumat a určit aktuální stav řádku. Následující tabulka obsahuje stručný popis každé RowState hodnoty výčtu.

Hodnota RowState Popis
Unchanged Od posledního volání AcceptChanges nebo od vytvoření DataAdapter.Fillřádku nebyly provedeny žádné změny.
Added Řádek byl přidán do tabulky, ale AcceptChanges nebyl volána.
Modified Došlo ke změně některého prvku řádku.
Deleted Řádek byl odstraněn z tabulky a AcceptChanges nebyl volána.
Detached Řádek není součástí žádného DataRowCollection. Nově RowState vytvořený řádek je nastavený na Detachedhodnotu . Po přidání nové DataRow do DataRowCollection volání Add metody, hodnota RowState vlastnosti je nastavena na Added.

Detached je také nastaven pro řádek, který byl odebrán z DataRowCollection metody, Remove nebo metodou Delete následovanou metodou AcceptChanges .

Je-li AcceptChanges volána na , DataSetDataTable nebo DataRow, všechny řádky se stavem Deleted řádku jsou odebrány. Zbývající řádky mají stav Unchangedřádku a hodnoty ve Original verzi řádku se přepíšou Current hodnotami verze řádku. Při RejectChanges zavolání se odeberou všechny řádky se stavem Added řádku. Zbývající řádky mají stav Unchangedřádku a hodnoty ve Current verzi řádku se přepíšou Original hodnotami verze řádku.

Různé verze řádku můžete zobrazit předáním DataRowVersion parametru s odkazem na sloupec, jak je znázorněno v následujícím příkladu.

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

Následující tabulka obsahuje stručný popis každé DataRowVersion hodnoty výčtu.

Hodnota DataRowVersion Popis
Current Aktuální hodnoty pro řádek. Tato verze řádku neexistuje pro řádky s příponou RowStateDeleted.
Default Výchozí verze řádku pro konkrétní řádek. Výchozí verze řádku pro Added, Modifiednebo Deleted řádek je Current. Výchozí verze řádku pro Detached řádek je Proposed.
Original Původní hodnoty pro řádek. Tato verze řádku neexistuje pro řádky s příponou RowStateAdded.
Proposed Navrhované hodnoty pro řádek. Tato verze řádku existuje během operace úprav na řádku nebo pro řádek, který není součástí DataRowCollection.

Můžete otestovat, jestli DataRow má konkrétní verzi řádku voláním HasVersion metody a předáním argumentu DataRowVersion . Například DataRow.HasVersion(DataRowVersion.Original) se vrátí false pro nově přidané řádky před AcceptChanges zavolání.

Následující příklad kódu zobrazí hodnoty ve všech odstraněných řádcích tabulky. Deleted řádky nemají Current verzi řádku, takže je nutné předat DataRowVersion.Original při přístupu k hodnotám sloupce.

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

Viz také