Свойство RowState
Для того, чтобы передать отложенные изменения в источник данных автономная модель ADO.NET должна документировать все действия, которые производит над данными(объектами DataRow) пользователь.
Специально для этого у объекта DataRow есть свойство RowState, позволяющее узнать что нужно делать со строкой при передаче отложенных изменений.
Свойство RowState может принимать элементы из перечисления
DataRowState.
Перечисление DataRowState
Элементы перечисления DataRowState
- Detached — Строка была создана, но не является частью какой-либо DataRowCollection. Объект DataRow имеет это состояние сразу после своего создания и перед добавлением в коллекцию, а также если он был удален из коллекции.
- Unchanged — Строка не была изменена с момента последнего вызова AcceptChanges.
- Added — Строка была добавлена в коллекцию DataRowCollection и метод AcceptChanges не был вызван.
- Deleted — Строка была удалена с помощью метода Delete объекта DataRow.
- Modified — Строка была изменена и объект AcceptChanges не был вызван.
Применение изменений
Для того чтобы применить все изменения произведенные со строками таблицы после передачи отложенных изменений объект DataRow имеет метод AcceptChanges;
При вызове метода AcceptChanges строки, подготовленные к удалению удаляются из коллекции строк таблицы, измененные, и добавленные строки становятся Unchanged Метод AcceptChanges так же есть у объектов DataSet и DataTable.
При вызове метода AcceptChanges на таблице у всех строк этой таблицы вызывается метод AcceptChanges.
При вызове метода AcceptChanges на DataSet вызывается метод AcceptChanges на всех таблицах этого DataSet
static void Main(string[] args)
{
DataTable table = new DataTable();
table.Columns.Add(new DataColumn("Column1"));
DataRow row = table.NewRow();
row[0] = "SomeValue";
Console.WriteLine(row.RowState); // Detached
table.Rows.Add(row);
Console.WriteLine(row.RowState); // Added
table.AcceptChanges();
//table.RejectChanges();
Console.WriteLine(row.RowState); // Unchenged
}
Версии строк
На практике иногда появляется потребность посмотреть значение измененной строки до изменения или же посмотреть данные строки,
подготовленной к удалению.
Для этого объект DataRow имеет перегрузку индексатора, которая принимает в качестве второго индекса элемент перечисления DataRowVersion.
Перечисление DataRowVersion
Элементы перечисления DataRowVersion:
- Current – позволяет узнать текущее значение строки.
- Original – позволяет узнать исходное значение строки.
- Porposed – позволяет узнать предпологаемое значение поля(действительно только при редактировании поля с помощью метода BeginEdit()).
- Default – версия по умолчанию для строки. Для значения DataRowState Added, Modified или Deleted версией по умолчанию является Current. Для значения DataRowState Detached версией по умолчанию является Proposed.
static void Main(string[] args)
{
DataTable table = new DataTable();
table.Columns.Add("Column1");
table.LoadDataRow(new object[] { "one" }, true);
table.LoadDataRow(new object[] { "two" }, true);
table.LoadDataRow(new object[] { "three" }, true);
for (int i = 0; i < table.Rows.Count; i++)
table.Rows[i][0] = "ChangedValue";
foreach (DataRow row in table.Rows)
{
Console.WriteLine("Column1 current value: " + row[0, DataRowVersion.Current]); // будут выведены текущие значения строк
Console.WriteLine("Column1 original value: " + row[0, DataRowVersion.Original]); // будут выведены оригинальные значения строк
Console.WriteLine("RowState: " + row.RowState);
Console.WriteLine();
}
}
Объект DataAdapter
Объект DataAdapter предоставляет набор команд SQL и подключение базы данных, которые используются для заполнения объекта DataSet или объекта DataTable а так же обновления источника данных.
static void Main(string[] args)
{
string connectionStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=ShopDB;Integrated Security=True";
SqlConnection connection = new SqlConnection(connectionStr);
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", connection);
DataTable customers = new DataTable("Customers");
SqlDataAdapter adapter = new SqlDataAdapter(cmd); // одна из перегрузок конструктора DataAdapter принимает объект Command
//SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Customers", connection);
adapter.Fill(customers); // метод Fill объекта DataAdapter позволяет заполнить таблицу данными
foreach (DataRow row in customers.Rows)
{
foreach (DataColumn column in customers.Columns)
Console.WriteLine("{0}: {1}", column.ColumnName, row[column]);
Console.WriteLine();
}
}