* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Модификация и обновление данных
8 февраля 2009
Содержимым объекта DataSet можно манипулировать, в частности редактировать его на клиентской машине. Разрешается модифицировать значения существующих объектов DataRow, а также удалять и добавлять к DataSet новые объекты DataRow. Однако модификации не будут реплицированы в БД, пока вы не обновите се с по- мощью объекта DataAdapter.
Каждый экземпляр DataSet поддерживает две версии этого объекта: текущую, расположенную на клиентском компьютере и содержащую все модификации, и исходную, не менявшуюся со времени заполнения DataSet. При вызове метода Update объекта DataAdapter на основе исходных значений генерируются команды UPDATE, INSERT и DELETE, необходимые для обновления БД. Модификация данных Есть два способа модификации объекта DataSet: через пользовательский интерфейс • при помощи элементов управления, связанных с данными, и программными средствами. Изменения, внесенные через связанные сданными элементы управле- ния, автоматически вносятся в соответствующую строку. Примечание Связывание данных подробнее обсуждается на следующем занятии. Также поддерживается программное добавление данных к объекту Data Row пу- тем установки свойства Item объекта DataRow, представляющего значения полей строки. Вот как это делается: Visual Basic .NET Item - это свойство по умолчанию объекта Dataflow, поэтому ссылаться на него явно не обязательно, Получить доступ к полю строки можно, ссылаясь на него по индексу, либо по имени, myOataRow(2) = "Splunge" myDataRowC'Customers") = "Winthrop" Visual C# // Item - это свойство по умолчанию объекта DataRow. поэтому // ссылаться на него явно не обязательно. Получить доступ к полю // строки можно, ссылаясь на него по индексу, либо по имени. myDataRow[2] = "Splunge"; myDataRow["Customers"] = "Winthrop"; Каждый объект DataRow поддерживает две версии состояния: исходную, содер- жащую первоначальные значения DataRow, и модифицированную. В любой момент можно отменить (откатить) любые изменения, внесенные в объект DataRow, вызвав метод RejectChanges: Visual Basic .NET myDataRow.RejectChanges() Visual C# myDataRow.RejectChanges(): Чтобы внести некоторые изменения в объект DataRow, вызовите метод Accept- Changes. В результате модифицированная версия объекта DataRow записывается поверх исходной. Visual Basic .NET myDataRow.AcceptChanges() Visual C# myDataRow.AcceptChanges(); Внимание! Если планируется реплицировать модификации в источник данных с помощью объекта DataAdapter, вызывать метод AcceptChanges до вызова метода Data- Adapter. Update нельзя, иначе объекту DataAdapter не удастся получить доступ к ис- ходной версии данных и сгенерировать корректную команду UPDATE. Определить состояние объекта DataRow можно посредством свойства ROM State. Оно принимает одно из значений, описанных в таблице 6-3. Объекты DataTable н DafaSetтакже поддерживают методы RejectChanges и Accept- Changes, позволяющие соответственно отвергнуть или принять все изменения, вне- сенные в DataTable или DataSet. Таблица 6-3. Значения свойства SowState Значение Описание Unchanged Строка осталась в исходном виде либо не была модифицирована после вызова AcceptChanges Modified Строка модифицирована после последнего вызова AcceptChanges Added Строка создана и добавлена в DataRowCollection, но метод AcceptChanges еше не вызван Deleted Строка удалена с помошью метода Data Row. Delete Detached Строка создана, но не добавлена ни в один из наборов Data Row Collection Обновление базы данных Закончив манипуляции над клиентской копией данных, можно обновить БД, вы- звав метод Update у каждого объекта DataAdapter. Visual Basic .NET myDataAdapter.UpdateO rnyOtherDataAdapter. Update() Visual C# myDataAdapter,Update(); myOtherDataAdapter.Update{); В результате изменения, внесенные в клиентскую копию данных, копируются в БД. При этом можно указать объект DataSet, DataTable или массив объектов Data- Rows, подлежащий обновлению: Visual Basic .NET myDataAdapter.Update(myDataSet) myDataAdapter.Update(myDataTable) myDataAdapter.Update(myDataRows) Visual C# myDataAdapter.Update(myDataSet); myDataAdapter.Update(myDataTable); myDataAdapter.Update(myDataRows); Транзакции В некоторых случаях требуется выполнить серию обновлений так, чтобы все они завершились успехом либо неудачей. Хороший пример приложения, где это необ- ходимо, — программа для банковского учета. Давайте рассмотрим метод, который снимает определенную сумму с одного счета (первая таблица) и зачисляет ее на другой счет (вторая таблица). Если первая операция пройдет успешно, а вторая окончится неудачей, результат окажется печальным. Решать подобные проблемы позволяют транзакции. Транзакция (transaction) — это набор логически связанных действий, выполняемых как единая операция. Для успеха транзакции все составля- ющие ее действия должны завершиться успешно, в противном случае выполняется откат всех операций транзакции, выполненных к этому моменту. Инициировать транзакцию можно, вызвав метод Begin Transaction любого объек- та Connection, представляющего открытое соединение. Этот метод возвращает ссыл- ку на транзакцию, которую нужно записать в свойство Transaction объектов всех команд, участвующих в данной транзакции. Далее необходимо исполнить команды транзакции. Если все они завершатся удовлетворительно, вызывается метод Transaction. Commit, что подтверждает изменения БД, в противном случае вызывается метод Transaction.Rollback, который отменяет коррективы. Следующий пример де- монстрирует исполнение транзакции с помощью объекта OleDbConnection с именем myConnection и двух объектов OleDbCommand с именами Updatelw Vpdate2. Примечание Для использования транзакций источник данных должен поддержи- вать транзакции. Visual Basic .NET Транзакции необходимо заключить в блок Try..Catch..Finally, чтобы иметь возможность перехвата любых исключений. Dim myTransaction As System.Data.OleDb.OleDbTransaction Try myConnection.Open() ' Создать новый объект транзакции и записать его в переменную myTransaction. myTransaction = myConnection.BeginTransaction Добавить команды Update! и Update? к транзакции. Update"!.Transaction - myTransaction Update2.Transaction = myTransaction ' Исполнить команды Update"! и Update2. Update"!. ExecuteNonQuery() Update2.ExecuteNonQuery() ' Если исключений не возникло, считать транзакцию успешной, myTransaction.Commit() Catch ex As Exception ' в противном случае отменить транзакцию. myTransaction. RollbackO Finally В любом случае соединение необходимо закрыть. myConnection.Close() End Try Visual C# // Транзакции необходимо заключить в блок Try..Catch..Finally, // чтобы иметь возможность перехвата любых исключений. System. Data. QleDb.OleDbTransaction nsyTransaction = null; try { myConnect ion. Open ( ); // Создать новый объект транзакции и записать его а переменную rnyTransaction. [TiyTransaction = myConnection. BeginTransaction{); // Добавить команды Updatel и Update2 к транзакции. Updatel .Transaction ~ rnyTransaction; Update2. Transaction - myTransaction; // Исполнить команды Updatel и Update2. Updatel. ExecuteNonQueryO; Update2. ExecuteNonQueryO; // Если исключений не возникло, считать транзакцию успешной, myTransaction. Commit () ; ! catch (Exception ex) { // а противном случае отменить транзакцию. rnyTransaction . Rollback( ) ; } f i n a l l y ! // В любом случае соединение необходимо закрыть. myConnection . CLose( ) : > Исполнение нескольких команд как транзакции 1. Откройте соединение с БД. 2. Получите ссылку на транзакцию, вызвав метол Connection. BeginTransaction. 3. Поместите полученную ссылку в свойство Transaction всех команд-участников транзакции. 4. Выполните команды транзакции. 5. Вызовите метод Transaction. Commit, чтобы завершить транзакцию. Транзакции доступны и при взаимодействии с БД через объект DataAdapter, но в этом случае применять их сложнее. Прежде всего необходимо создать транзакцию, вызвав метод BeginTransaction объекта, который представляет открытое соединение. Далее созданную транзакцию помещают в свойства Transaction объектов, представ- ляющих команды Insert Command, UpdateCommand и DeleteCommand всех объектов DataAdapter, которые будут задействованы при обновлении БД. После этого можно вызвать метод Update каждого объекта DataAdapter и завершить транзакцию, вызвав метод Commit или Rollback объекта этой транзакции.