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

 

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

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

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

Приложение Timestamp
На прилагаемом к книге компакт-диске записано приложение Пгз^лдпзр (на Visual Basic NET и на Visual С* .NET), иллюстрирующее все три способа выборки данных после передачи обновления (рис. 11-1).
Приложение демонстрирует исходную проблему: если не выбирать после передачи изменений в БД новые значения timestamp, последующие попытки обновления этих же записей завершатся неудачей.
4 \h л\H-.:!fii -..г"¦; update !u M?Srii:;v6M"ii'w timestamp ^h;^:
Summary
в
sample lienffins-rstis Ti-ricuS Jfays =' "Ag Ci>i in a
v alter submitting 'oJv-
When you cfck any o[ the buttons below, the code will run a test the! adds a new mw to a lable that curtains a timestamp column.
The lest mil then rnorffji the contents ol Ihe DataRow and try to Submit that change to the database. 11 I, the update succeeds. Ihe test w(l then try ID delete the low Irom the database
J In each lest, the DataAdeptel relies on the table's primary key and timestamp values ID enforce optimistic Concurrency 11 tne DataRow object does not contain Ihe lireslamp value that currently resides in the ^database, then the update atlempl will fail
Normal
3euJts
Beli'.cr.,bjsi^"or Updale
Handle RowJpdaied ? mt
Output Parameter
Retrieving new:.:. - stored procedures output i...-'-.-
rnsart succeeded Update hjc-ieednJI Ddete succeeded!
Рис. 11-1. Приложение Timestamp
Выборка новых значений автоинкремента
SQL Server, Access, Sybase и другие БД используют столбцы с автоннкрсментоу.также называемые столбцам/IDE:\!'!TlYyU')\:.r<T\"Г columns). Вы можете вставить в таб-
ГЛАВА 1 Сложные случаи обновления данных
411
лицу новую запись, и БД сгенерирует для нее новое значение поля с автоинкрементом. Многие таблицы БД Northwind, например Employees. Orders и Products, используют столбцы с автоинкрементом в качестве первичного ключа.
Почему работа со столбцами с автоинкрементом считается сложным случаем обновления? Вы можете передать в БД новую запись, но БД сгенерирует для нее новое значение поля с автоинкрементом. Это означает, что после передачи новой записи в БД значение ее поля с автоинкрементом вам неизвестно. Вообще говоря, вам требуется знать значение первичного ключа записей,
Так как же средствами объектной модели ADO.NET получить для записи новое значение автоинкремента?
Работа с SQL Server
Представьте на минуту, что вы передаете изменения в БД не с помощью объекта DataAdapter, а разрабатываете для этой цели собственные запросы,
При работе со сведениями о заказах из БД Northwind получить данные из таблицы Orders можно средствами следующего запроса:
select OrderlD, CustomerlD, BmployeelD. OrderDate from Orders
Для вставки новой записи в таблицу используйте такой запрос:
INSERT INTO Orders (CustomerlD, EmployeelD, OrderDate) VALUES (?, ?, ?)
Получить значение автоинкремента, сгенерированное БД для новой записи, можно с помощью показанного ниже запроса:
SELECT (MOENTITY
Примечание Почему «можно», а не «нужно»? Подробнее об этом - в разделе этой главы, посвященном сравнению функции EN'ПТУ и ключевого слова SCOPEJDKNTiTY.
Этот запрос — ключ к получению значения автоинкремента. Данный запрос используется в объектной модели ADO.NET так же, как и запрос из предыдущего примера, возвращающий значение timestamp.
Можно изменить значение свойства Сотюа-чаТзх; команды ImerlConamnd объекта DataAdaptem выполнять запрос SELECT ШШЕШТТТпосле каждой вставки:
INSERT INTO Orders (CustomerlD, EmployeelD, OrderDate) VALUES (?, ?, ?); select «#IDENTITY AS OrderlD
Заметьте: SELECT^IIltlNTl'l ^ запрос включает псевдоним, указывающий объекту в какой столбец поместить результаты запроса.
Как и при выборке новых значений timestamp, вернуть новое значение автоинкремента удается средствами параметра вывода хранимой процедуры:
create procedure spOrdersInsert (eOrderlD int OUTPUT, SCustomerlD nchar(5), ^EmployeelD int, ©OrderDate datetiine) as
INSERT INTO Orders (CustomerlD, EmployeelD, OrderDate)
412
Часть III Автономная работа с данными: объект DataSet модели ADO.NET
VALUES (©CustcusrlD. ©EaployeelD, Girder Date) SELECT eOrderlD = (^IDENTITY
Наконец, можно воспользоваться событием RowUpdated объекта и выполнить запрос, выбирающий новое значение автоинкремента:
Visual Basic
Dim da As OleDbDataAdapter = CreateMyDataAdapter()
Dim cn As OleDbConnection = da.SelectComrnand.Connection
Dim cmdGetldentity As New 01eDbCommand("SELECT ^IDENTITY", cn)
AddHandler da. RowUpdated, AddressOf HandleRowUpdated
Dim tbl As DataTable = CreateMyDataTableQ
da.Fill(tbl)
da.Update(tbl)
Private Sub HandleHowUpdatediSyVal sender As Object,
ByVal e As OleDbRowUpdatedEventArgs) If e.Status = UpdateStatus.Continue AndAlso e.StatementType = Statement/Type. Insert Then e.Row("OrderID") = CType(cmdGetIdentity.ExecuteScalar, Integer) e.Row.AcceptChanges?) End If End Sub
Visual C# NET
OleDbDataAdapter da = CreateHyDataAdapter(); OleDbConnection cn = da.SelectCommand.Connection;
OleDbCommand cmdGetldentity = new 01eDbCommand("SELECT ^IDENTITY", cn);
Предыдущая << 1 .. 173 174 175 176 177 178 < 179 > 180 181 182 183 184 185 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100