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 Original
který 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 Detached hodnotu . 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 RowState Deleted . |
Default | Výchozí verze řádku pro konkrétní řádek. Výchozí verze řádku pro Added , Modified nebo 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 RowState Added . |
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();
}