Обновление источника данных

Ключевой функцией любого приложения базы данных является возможность обновления данных, хранимых в базе данных. В ADO.NET обновление данных включает использование DataAdapter и DataSet, а также объектов Command. Обновление может включать использование транзакций.

DataAdapter.Update метод

С помощью метода Update объекта DataAdapter можно передавать
отложенные изменения в источник данных.

Перегрузки метода DataAdapter.Update:

  • DataAdapter.Update(DataSet) – обновляет источник на основе
  • данных, предоставленных объектом DataSet.
  • DataAdapter.Update(DataTable) – обновляет источник на основе данных, предоставленных объектом DataTable.
  • DataAdapter.Update(DataRow[]) – обновляет источник на основе данных, предоставленных массивом объектов DataRow.

Как работает метод Update

Обновление выполняется построчно. Для каждой вставленной, измененной и удаленной строки метод Update определяет тип изменений, выполненных в ней (Insert, Update или Delete).В зависимости от типа изменений шаблон команд INSERT, UPDATE, или DELETE выполняется для распространения измененной строки в источник данных.

Проще говоря, когда приложение вызывает метод Update, объект DataAdapter проверяет свойство RowState и выполняет необходимые операторы INSERT, UPDATE или DELETE для передачи отложенных изменений в источник данных. Если операторы INSERT, UPDATE или DELETE не были указаны, метод Update создает исключение.

  static void Main(string[] args)
        {
            string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=ShopDB;Integrated Security=True";
            string commandString = "SELECT * FROM Customers";

            DataTable customers = new DataTable("Customers");

            SqlDataAdapter adapter = new SqlDataAdapter(commandString, connectionString);
            adapter.Fill(customers);

            DataRow selectedRow = customers.Select("CustomerNo = 1")[0];
            selectedRow["FName"] = "TestValue";

            selectedRow = customers.Select("CustomerNo = 2")[0];
            selectedRow.Delete();

            try
            {
                adapter.Update(customers);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

Создание команды для вставки данных

Для того чтобы DataAdapter знал как передавать данные строк, у которых свойство RowState имеет значение Added ему нужно предоставить экземпляр SqlCommand, имеющий логику вставки данных в источник.

Создание команды для удаления данных

Для того чтобы DataAdapter знал как передавать данные строк, у которых свойство RowState имеет значение Deleted ему нужно предоставить экземпляр SqlCommand, имеющий логику удаления данных в источнике.

Создание команды для изменения данных

Для того чтобы DataAdapter знал как передавать данные строк, у которых свойство RowState имеет значение Updated ему нужно предоставить экземпляр SqlCommand, имеющий логику изменения данных в источнике.

После присвоения свойствам InsertCommand, UpdateCommand и DeleteCommand объекта DataAdapter соответствующих команд(экземпляров SqlCommand), объект DataAdapter полностью сконфигурирован для передачи отложенных изменений в источник данных.

static void Main(string[] args)
        {
            string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=ShopDB;Integrated Security=True";
            string commandString = "SELECT * FROM Customers";

            DataTable customers = new DataTable("Customers");

            SqlDataAdapter adapter = new SqlDataAdapter(commandString, connectionString);
            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            adapter.Fill(customers);

            //*********************************************Adding Data******************************************

            customers.LoadDataRow(new object[] { -1, "TEST", "TEST", "TEST", "TEST", "TEST", "TEST", "TEST", "9999/12/31" }, false);

            adapter.Update(customers);

            customers.Clear();
            adapter.Fill(customers);

            Console.WriteLine("Customers after adding test rows");
            
            foreach (DataRow row in customers.Rows)
            {
                foreach (DataColumn column in customers.Columns)
                    Console.WriteLine("{0}: {1}", column.ColumnName, row[column]);

                Console.WriteLine();
            }
            Console.ReadKey();
            Console.Clear();


            //*********************************************Changing Data******************************************

            DataRow[] changedRows = customers.Select("Phone = 'TEST'");

            foreach (var singleRow in changedRows)
            {
                singleRow[1] = "ChangedValue";
                singleRow[2] = "ChangedValue";
                singleRow[3] = "ChangedValue";
            }

            adapter.Update(customers);

            customers.Clear();
            adapter.Fill(customers);

            Console.WriteLine("Customers after changing test rows");

            foreach (DataRow row in customers.Rows)
            {
                foreach (DataColumn column in customers.Columns)
                    Console.WriteLine("{0}: {1}", column.ColumnName, row[column]);

                Console.WriteLine();
            }

            Console.ReadKey();
            Console.Clear();


            //*********************************************Deleting Data******************************************
            DataRow[] rowsToDelete = customers.Select("Phone = 'TEST'");

            foreach (var singleRow in rowsToDelete)
            {
                singleRow.Delete();
            }

            adapter.Update(customers);

            customers.Clear();
            adapter.Fill(customers);

            Console.WriteLine("Customers after deleting test rows");

            foreach (DataRow row in customers.Rows)
            {
                foreach (DataColumn column in customers.Columns)
                    Console.WriteLine("{0}: {1}", column.ColumnName, row[column]);

                Console.WriteLine();
            }

            Console.ReadKey();
            Console.Clear();
        }
Обновлено: 27.02.2019 — 13:08

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

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

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