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

 

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

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

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 163 164 165 166 167 168 < 169 > 170 171 172 173 174 175 .. 260 >> Следующая

SELECT CustomerlD, CompanyName, ContactName, Phone FROM Customers WHERE ЙерДОП = NUtt
ГЛАВА 10 Передача обновлений в базу данных 387
I'iiii-iiij.ii.:-!i)H,iiiiiii]ci. этим запросом в ADO.NET или выполнив его в SQL Query-Analyzer, вы увидите, что он вернул ноль записей.
Значения NULL — особый случай в мире БД, особенно когда дело доходит до, сравнения таких значений в запросах. Согласно стандартам ANSI, сравнивать значения NULL с помощью оператора = нельзя. Вместо этого следует использовать оператор IS NULL. Показанный далее запрос возвращает записи таблицы Customers, значение поля Region которых — NULL:
SELECT CustOJierlD, CoupanyKsua, Contact Name. Phone from Customers where Region is null
Что общего имеют значения NULL с передачей обновлений в БД при помощи объекта DataAdaptef'. Давайте кратко обсудим значение свойства CommandText объекта Command, созданного нами ранее для передачи измененных записей в таблицу Order Details;
UPDATE [Order Details]
SET OrderlD = ?, ProductlD = ?, Quantity = ?, UnitPrice = ? WHERE OrderlD = ? AND ProductlD = ? AND ¦Quantity = ? AND UnitPrice = ?
Ни одно из указанных в запросе полей не принимает значений NULL. Как следствие, раздел WHERE этого запроса относительно прост. Но что, если бы поля Quantity и UnitPrice принимали такие значения? Скажем, вы меняете текущее значение поля Quantity, NULL, одной из записей на 20, Если заменить параметры реальными значениями, запрос будет выглядеть так:
UPDATE [Order Details]
SET OrderlD = 12345, ProductlD = 1, Quantity = 20, UnitPrice = 18 WHERE OrderlD = 12345 AND ProductID = 1 AND Quantity = Null AND UnitPrice = 18
Из-за оператора Quantity = ШШ, включенного в раздел WHERE, запрос не изменит ни одной записи. Значение поля Quantity нужной нам записи БД — Null, однако сравнение Null = Null вернет, false, и поэтому БД не изменит ни одной записи,
Так как же изменить раздел WHERE наших запросов и использовать значения 'w 7 / при контроле параллелизма? Если определенное поле принимает значения NULL, часть запроса
iloluniuName = ?
можно заменить следующей
(ColumnName = ? OR ((ColumnName IS NULL) AND {? IS NULL)))
Нам нужно, чтобы операция сравнения возвращала когда поле и имеют одинаковое, отличное от NULL значение или оба имеют значение NULL.
Предположим, объект DataAdapter выбирает из таблицы Customers столбцы CustomerlD, CompanyName, ContactName и Phone. Поля CustomerlDn Company-Name не принимают, а поля ContactName и Phone принимают значения NULL. Следовательно, в разделах WHERE обновляющих запросов следует реализовать проверку па наличие значений NULL. Если вы создаете логику обновления средствами m;lc-
388
Частый Автономная работа с данными: объект DataSet модели auo.nft
тера Data Adapter Configuration Wizard, то обнаружите, что мастер сгенерировал для передачи изменений следующий код и дополнил его соответствующими проверками на наличие значений NULL:
UPDATE Customers
SET CustomerlD = ?, CompanyName = ?, ContactName = ?, Phone = ? WHERE (CustomerlD = ?} AND (CompanyName = ?) AND
(ContactName = ? OR ((? IS NULL) AND (ContactName IS NULL))) AND (Phone = ? OR ((? IS NULL) AND (Phone IS NULL)))
Как уже говорилось, мастер Data Adapter Configuration Wizard выполняет очень большую работу по созданию логики обновления. Даже если вы разрабатываете
собственную логику, просмотрите сгенерированный мастером код, чтобы проконтролировать себя и свою работу.
Передача обновлений в транзакциях
А если вам требуется передать все изменения в виде отдельной единицы работы, чтобы или все они были успешно переданы в БД, или ни одно из них. Простейшее решение — поместить обновления в транзакцию. Тем не менее у объекта DataAdapter нет свойства Transaction.
Объект DataAdapter в действительности не передает изменения. Он лишь передает работу объектам Command, хранящимся в свойствах UpdateCommandlnsert-Command и DeleteCommand. Объект Command предоставляет свойство Transaction. и поэтому для передачи изменений с помощью DataAdapter нужно задать значение свойства Transaction объекта Command., используемого объектом DataAdapter. как показано ниже:
Visual Basic .NET
Dim strConn, strSQL As String
strConn = "Provider=SQL0LEDB; Data Source=(local)\NetSDK;" &
¦ ' Catalog=Northwind;Trusted_Connection=Yes;"
strSQL = "SELECT OrderlD, ProductID, Quantity, DnitPrice " & _
"FROM [Order Details] WHERE OrderlD = 10503 " & _
"ORDER BY ProductID" Dim tbl As New DataTable() Dim cn As New OleDbConnection(strConn) Dim da As New 01eDbDataAdapter(strSQL, cn) 'Define updating logic for the DataAdapter.
Открывав! соединение и выбираем результаты запроса сп.0реп() da.Fill(tbl)
¦изменяв» содержимое объекта DataTable 'Создаем новую транзакцию
Dim txn As OleDbTransaction = cn. BeginTransaction() 'Задаем значение свойства Transaction объектов Command, 'используемых объектом DataAdapter
ГЛАВА 10 Передача обновлений в базу данных
389
da.UpdatoCor-msrci Transaction = txn da.InsertCommand.Transaction = txn da.DeleteCommand.Transaction = txn
Предыдущая << 1 .. 163 164 165 166 167 168 < 169 > 170 171 172 173 174 175 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100