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

 

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

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

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

Итак, если задать эту хранимую процедуру свойству объекта
DataAdapter, последний всегда считает, что обновление завершилось успешно.
Ключевое слово NOCOUNT SQL Server позволяет управлять тем, сообщают ли запросы о результатах выполнения. Добавив в хранимой процедуре перед запросом UPDATE ключевое слово SET NOCOUNT ON и вызвав ее в SQL Server Query Analyzer, мы получим следующий результат:
The command(s) completed successfully.
Он не обязательно соответствует успешному но означает лишь,
что запрос не сгенерировал ошибки. БД, в отличие от вас, не считает запрос, не
изменивший ни одной записи, ошибочным.
Подавление вывода сообщений о числе записей, обработанных выполняемыми процедурой запросами, не решает проблему, Если задать свойству UpdateCom-
mand объекта DataAdapter новую версию хранимой процедуры, DataAdapter по-
прежнему считает, что все попытки обновления завершились успешно.
Нам требуется подавить сообщения «row(s) affected» всех запросов, за исключением изменяющего нужную запись БД. Для этого в хранимой процедуре ключевое слово SET NOCOUNT ON следует переместить за запрос UPDATE, как показано ниже:
CREATE PROCEDURE spOrderUpdate (®CustomerID_New nchar(5), @EmployeeID_New int,
®OrderDate_New datetime, int,
@CustomerID_Orig nchar(5), §EmployeeID_Orig int,
eOrderDate_urig datetime) AS
UPDATE Orders
SET CustomsrID = @CustomerID_New, EmployeelD = №nployeeID_New,
OrderDate = «OrderDate.New WHERE OrderlD = $OrderID_Orig AND CustomerlD = ®CustomerID_Orig AND EmployeelD = @EmployeeID_Orig AND OrderDate = @0rderDate_Orig
SET NOCOUNT ON
420
Часть III Автономная работа с данными: объект DataSet модели aijO.NET
IF tpBROWCOUNT = 1
INSERT INTO OrdersLog (TypeOfChange, DateOfChange)
VALUES ('Modified order ' + «5rderID_0rig, GetDateO)
ELSE
INSERT INTO OrdersLog (TypeOfChange, DateOfChange)
VALUES ('Failed to modify order ' + §OrderID_Orig, GetDateO)
RETURN
Если процедура выполнением запроса UPDATE добавляет запись таб-
лицу ~щ"":'згля, можно воспользоваться таким кодом:
CREATE PROCEDURE MyUpdateProcedure (. . . ) AS
SET NOCOUNT ON
INSERT INTO HyLogTable .,,
SET NOCOUNT OFF UPDATE MyTable SET
RETURN
Если вы не уверены в как интерпретирует результаты запро-
са, заданного свойству или про-
верьте возвращаемое значение метода Какое значение
метод возвращает, если вы передали параметры, обеспечившие успешное выполнение запроса? Какое значение возвращается, когда переданные параметры приводят к неудачному выполнению запроса?
Передача изменений
Если вы изменяете данные на нескольких уровнях иерархичного объекта DataSet, при передаче этих изменений в БД возникают две проблемы. Рассмотрим их поподробнее.
Передача записей, ожидающих вставки и удаления
вы имеете дело с иерархией, включающей о клиен-
тах и заказах. Созданное вами приложение — система приема заказов. Пользователь внес ряд изменений в данные и теперь хочет эти изменения в БД. Измененные данные в объекте DataSet теперь содержат новых клиентов и новые заказы. Кроме того, DataSet содержит записи о клиентах и заказах, помеченные на удаление.
Проблема в том, чтобы передать эти изменения в правильном порядке, соответствующем определенным в БД ссылочной целостности. ничения ссылочной целостности БД Non h wind требуют, чтобы записи о заказе соответствовала запись о клиенте.
Если DataSet включает новых клиентов и соответствующие им новые следует сначала передать записи о клиентах и только потом — записи о размещенных ими заказах. Как новые записи следует передавать в нисходящем порядке.
ГЛАВА Сложные случаи обновления данных
421
Тем не менее для удаленных записей верно обратное. Удалить из БД Nonbwmd клиентов, имеющих размещенные заказы, нельзя. Следует предварительно удалить соответствующие записи о заказах.
Примечание Данный пример — упрощение проблемы, носящей общий характер. БД Northwind не позволит удалить заказ, которому соотвстствуку? записи таблицы Order Details.
Следующий фрагмент кода выполняется с ошибкой, поскольку пытается удалить клиентов, имеющих размещенные заказы.
Visual Basic .NET
CustoitiersAdapter.Update?HyDataSet.Tables?"Customers")) OrdersAdapter.Update? MyDataSet.Tables?"0 rde rs"))
Visual C# .NET
CustomersAdapter,Update?HyDataSet.Tables["Customers"]); OrdersAdapter.UpdatefMyDataSet.Tablest"Orders"]);
Но если обратить порядок обновлений, перв'ая попытка обновления завершится неудачно, так как объект DataAdapter, связаппый с таблицей Orders, пытается передать заказы, размещенные клиентами, отсутствующими в БД.
Visual Basic .NET
OrdersAdapter.Update?MyDataSet.Tables?"0 rders")) CustomersAdapter.UpdatefMyDataSet.Tables?"Customers"))
Visual C#
OrdersAdapter.UpdatefMyDataSet.Tables["0 rde rs"]); CustomersAdapter.UpdatefMyDataSet,Tables["Customers"]);
Что же делать бедному программисту? Нужен способ, который позволит организовать передачу изменений из иерархичного объекта Daia-Scl в следующем порядке:
I новые клиенты;
2. новые заказы;
3. измененные «сжзсск; -измененные заказы;
Предыдущая << 1 .. 177 178 179 180 181 182 < 183 > 184 185 186 187 188 189 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100