Свойство 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 а так же обновления источника данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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(); } } |