Ключевой функцией любого приложения базы данных является возможность обновления данных, хранимых в базе данных. В 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 создает исключение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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 полностью сконфигурирован для передачи отложенных изменений в источник данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
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(); } |