Строки и адаптер данных.

Свойство 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();
            }
        }
Обновлено: 27.02.2019 — 09:43

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.