Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Вебмастеру -> Сеппа Д. -> "Microsoft ADO.NET" -> 189

Microsoft ADO.NET - Сеппа Д.

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 183 184 185 186 187 188 < 189 > 190 191 192 193 194 195 .. 260 >> Следующая

ModlfyDataSetContents(dsHatn);
DataSet dsChanges = dsMain.GetChangesO;
dsChanges = objWebService.SubmltChanges(dsChanges);
//Перед слиянием содержимого основного DataSet и данных DataSet, //возвращаемого Web-сервисом, удаляем из основного DataSet //новые заказы, ожидающие передачи в 6Д DataTable tbl = dsMain.Tables["Orders"].;
foreach(DataRow row in tbl. Selectf", "". DataRowViewState. Added))
tbi. Rows. Remove( row)', dsMain.Merge(dsChanges); dsMain.AcceptChangesC);
Просмотр содержимого основного DataSet и удаление новых заказов, ожидающих ]чдну!.!ч;.| в БД. — слишком и hi lit и-к.- рени-нис, однако оно определенно
устраняет проблему.
Смена первичного ключа в объектах DataSet
Есть еще одно решение, однако оно не для людей, слабо разбирающихся и коде. Вы уже понимаете принципы работы метода Merge и знаете, почему в и:; •:;:>•• аналогичных рассматриваемому примеру, он объединяет содержимое объектов DataSet не так, как требуется. У записей, которые нужно объединить, разные зна-поля первичного ключа.
ГЛАВА 11 Сложные случаи обновления данных
435
Что, если изменить первичный ключ? Перед слиянием содержимого двух объектов DataSet можно выбрать в каждом объекте DataTable новый столбец первичного ключа. Если у соответствующих записей объектов DataSet значения нового поля первичного ключа сойпйд«;ют. при слиянии содержимого объектов DataSet мы получим нужный результат. После слияния можно сделать столбцом первичного ключа столбец, который был им изначально.
Добавим в оригинальный объект ВйМШЫе новый столбец с именем PseudoKey (рис. I 1-12). Это просто условный столбец, который не соответствует какому-либо ¦столбцу БД. Его назначение - помочь нам вставить метод Merge выдать нужный результат.
Основной оОьккт DataSet с новыми .записями
; ОгШВ CusomertD ID OrderDate: PseudoKey
10643 ALFKl 6 09/22/1997 1
10692 ALFKI 4 10/31/1997 2
-1 ALFKI 7 02/24/2002 3
-2 ALFKI Т 02/24/2002 4

Объект DataSet. возвращенный Web-сервисом и содержащий НОЗЫезнзч&нич
OrderiO EinaloyeelD ' OrderDate PseudoKey
12О0О ALFKI 7 02/24/2002 3
12001 ALFKI 7 02/24/2002 4

Основной объект DataSet после слияния ссбьеито» MaSet. возвращенным Web-СврзйСОМ
;QfderlD GustomerlO Employ eelD OrderDate PseudoKsy
10643 ALFKI 6 09/22/1997 1
10692 ALFKI 4 10/31/1997 2
12000 ALFKI 7 02/24/2002 3
12001 ALFKI 7 02/24/2002 4
Рис. 11-12. Добавление псевдоключа ^еиёоКеу) в объект DаtаSet для переноса п. я-их. значений
Как программно г..зм-с-;!!грь первичный ключ таблиц непосредственно перед слиянием и затем сделать первичным ключом • • •... и являвшийся им нзнзчлль-но? Решение не особенно изящное, но и не особенно сложное;
436
Часть III Автономная работа с данными: объект DataSet модели ado.net
Visual Basic NET
Dim objWebService As New WeoSarviceClassf)
Dim dsMain As DataSet = objWebService.GetDataSetC)
ModifyDataSetContents(dsMain)
Dim dsChanges As DataSet = dsMain.GetChangesC) dsChanges = objWebService.SubmitChanges(dsChanges)
'Делаем столбцом первичного ключа обеих таблиц столбец Pseuclokey Dim tblMain As DataTable = ds.Tables("Orders") Dim pkOrigtnal As DataColumnO = tblHaln.PrimaryKey tblMain.PrimaryKey = New DataColumnO jtblMain.Columns("PseudoKey")} Dim tblChanges As DataTable = dsChanges.Tables("Orders") tblChanges.PrimaryKey = New DataColumnO {tblChanges.Columns("PseudoKey")}
dsMain.Merge{dsChanges)
'Делаег столбцом первичного ключа основной таблицы 'столбец, являвшийся им изначально tblMain.PrimaryKey = pkOriginal
dsMain.AcceptCbanges()
Visual C# .NET
WebServiceClass objWebService = new WebServiceClassC);
DataSet dsMain = objWebService,GetDataSet<);
ModifyDataSetContents(dsMain);
DataSet dsChanges = dsMain. GetChangesO;
¦dsChanges = objWebService, SubmitChanges(dsChanges);
//Делаем столбцом первичного ключа обеих таблиц столбец Pseudokey DataTable tblMain = ds.Tables["Orders"]; DataColumn[] pkOriginal = tblMain. PrimaryKey;
= new
DataTable tblChanges = dsChanges.TablesfOrders"];
= new
dsMain.Merge(dsChanges);
//Делаем столбцом первичного ключа основной таблицы им
tblMain.PrimaryKey = pkOriginal;
dsMain.AcceptChanges();
Но что насчет содержимого столбца I'sciKloKeyr Как генерировать для него уникальные. м i;iчем ил, если он не соответствует ни одному из столбцов БД. Можно воспользоваться... другим столбцом с автоинкрементом.
ГЛАВА 11 Сложные случаи обновления данных
437
Выбор способа решения проблем с объединением содержимого
Лично мне не нравится ни одно из описанных решений. Они по меньшей мере неэлегантны. Репи-ппе, связанное со сменой первичного ключа, может оказаться ¦очень сложным, особенно если у рассматриваемой таблицы есть в объекте DataSet дочерние объекты DataTable. Если бы от меня требовалось выбрать решение, я бы предпочел то, которое перед вызовом метода Merge удаляет из оригинального объекта DakiSei записи, ожидающие вставки в БД. Однако я вынужден признать: даже эти неэлегантные варианты — значительный таг вперед по сравнению с ADO. где вообще не удавалось решить эту проблему.
Предыдущая << 1 .. 183 184 185 186 187 188 < 189 > 190 191 192 193 194 195 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100