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

 

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

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

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

eUnitPriceNew money, tOrderlDOrig int, OTroductlOOrig int,
@>TSCol timestamp OUTPUT) AS
UPDATE [Order Details]
SET OrderlD = @OrderIDNew, ProductID = OProductlDNew,
Quantity = tQuantityNew, UnitPrice = @UnitPriceNew WHERE OrderlD = @OrderIDOrig AND ProductID = (aProductlDOrig AND TSCOl IIISCol: IF «ROWC0UNT = 1
SELECT ©TSCol = TSCol FROM [Order Details]
WHERE OrderlD = ©OrderlDhlew AND ProductID = iOrderlDMew
Все, что осталось сделать, — задать свойству СШШтШШобъекта UpdateCom-maiui хранимую процедуру, создать :\%Ъо" Pxr^meters объекта < шчншиЬ i задать свойству UpdatedRowSourceo6bQKTa Command значение OutputParametersили Both.
Этот процесс более эффскпшен. чем возврат средствами запроса SELECT.
Проверить значение параметра гораздо быстрее, чем выбрать результаты запроса. Кроме того, БД типа Oracle поддерживают параметры вывода, но не поддерживают пакетные запросы, зэгзззгдаюгдкс записи.
Выборка данных с помощью события объекта
DataAdapter после передачи обновления
Некоторые БД, например Microsoft Access, не поддерживают пакетные запросы, возвращающие записи, и не поддерживают параметры вывода хранимых процедур. При работе с такими БД два описанных выше способа выборки данных после передачи обновления становятся недоступными. Тем не менее есть еще один способ, не связанный с переходом на БД, поддерживающую нужную функциональность.
У объекта i Hiit-L'htapii-; есть два события, наступающих при передаче изменений, кэшированных в объекте DatctRow - RowUpdating^ RowUpdated. Как следует из их имен, первое событие наступает непосредственно перед передачей изменения, а последнее — сразу после передачи.
Если передаются изменения нескольких записей, события RowUpdatingи RowUpdated наступают для каждой из них. Добавив код регистрации событий, вы увидите в журнале следующие записи:
RowUpdating event fired for row #1 RowUpdated event fired for row #1 RowUpdating event fired for row #2 RowUpdated event fired for row #2 RowUpdating event fired for row #3 RowUpdated event fired for row 83
С помощью события RowUpdated удается выбрать новое значение, генерируемое БД для обновленной записи. Следующий фрагмент кода демонстрирует растр, с событием RowUpdated. Для краткости он ссылается на выдуманные с|.\ ик-
ГЛАВА 11 Сложные случаи обновления данных 409
ii.nn. о.ги.и.шпк. объекты DataTable, и Command для выборки нового
значения timestamp.
Заметьте: в обработчике события RoivUpdatedKox проверяет успешность обновления и то, что изменение записи является обновлением или вставкой. Понятно, что при удалении записи БД потребности в запросе для получения нового значения timestamp не возникнет. Кроме того, поскольку объект Command, выбирающий новое значение timestamp, . . только одно значение, код получает его с помощью метода
Visual Basic NET
Dim da As OleDbDataAdapter = CreateKyDataAdapt#rO Dim cmdGetNewTS As OleDbCommand = CreateGetNewTSCommandO AddHandler da.RowUpdated, AddressOf HandleRowUpdated Dim tbl As DataTable = CreateMyDataTableO da.Fill(tbl)
da.Update(tbl)
Private Sub HanclefiowUpdated<ByVai sender As Object,
ByVal e As OleDbRowUpdatedEventArgs) If 6.Status = UpdateStatus.Continue AndAlso _ (e.StatementType = StatementType.Insert OrElse e.StatementType = StatementType.Update) Then cmdGetNewTS.Parameters(,,euгderlD¦,). Value = e.Row("OrderID") cmdGetNewTS.Parameters("?prqductID"). Value = e.Row<"ProduetID") «!.row("TSCyl ') = CTypefcindGetNewTS.ExocuteScalar. ByteO) e. Row. AcceptChangesQ End If End Sub
Visual C# .NET
OleDbDataAdapter da = CreateRyDataAdaoterO,
OleDbCommand cmdGetNewTS = CreateGetNewTSCommandO;
da.RowUpdated += new OleDbRowUpdatedEventHandler(HandleRowUpdated);
DataTable tbl = CreateMyDataTableO;
da.Fill(tbl);
da.Update(tbl);
private void Martd.1eRawUpdated< object sender, OleDbRowUpdatedEventArgs e) {
if ((e.Status = UpdateStatus.Continue) &&
C(e.StatementType == StatementType.Insert) || • Ce.StateiBentTyp* == StatementType. Update)))
{
cmdGetNewTS. Parameters. "6>0rrJerID" ] .Value = e. Rowf"OrderlD"]; cmdGetNewTS.Parameters["@ProductID"].Value = e.Row["ProductID"]; e.Row["TSCol"] = (byte[]) cmdGetNewTS. ExecuteScalarO;
410
Часть III Автономная работа с данными: объект DataSet модели а jO.NET
е, Row. AcceptChangesO;
Получив новое значение timestamp и задав его соответствующему полю объекта LhiidRiiir. код с помощью метода подтверждает это изменение.
Без вызова метода AccejitChemiies объект 1>а1акш< кэшировал бы изменение, чтобы его позже передать в БД. Это совсем не то, для чего мы получали новое значение timestamp. Вызывая у.сгаяЛса'рп.Ъану.ех. мы указываем Л DO NET просто принять хранящиеся в DataRoiv изменения.
Данный метод очень гибок, поскольку работает в любой БД; тем не менее за гибкость приходится платить производительностью. В выполненных мной тестах производительность выборки значений timestamp с использованием событий оказалась на 35% ниже производительности пакетных запросов и на 50% ниже производительности параметров вывода хранимых процедур.
Предыдущая << 1 .. 172 173 174 175 176 177 < 178 > 179 180 181 182 183 184 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100