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

 

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

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

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

Известно два способа использования последовательности. Во-первых, на нее можно cccxaTJrCt в запросе INSERT
INSERT INTO NyTable (ID, OtherColumn)
VALUES (MySequence.NEXTVAL, 'New Row')
При каждом выполнении запроса последовательность будет возвращать новое значение.
После вставки новой записи выполняют запрос к последовательности и определяют последнее использованное значение:
ГЛАВА Сложные случаи обновления данных 415
select HySequenos.CURRVAl FROM dual
Как и в случае запроса SELECT ч^Шг. NTiTY в БД Access и SQL Server, работа других пользователей, вставляющих новые записи с применением этой же последовательности, на результаты данного запроса не влияет.
Так как вставить новые значения последовательности в объекты [>ai:iR< пг: Oracle не поддерживает пакетные :«.;;pncu. возвращающие данные, и поэтому в свойстве
команды нельзя использовать оператор
VAL. Тем не менее разрешается выполнить в обработчике события RowUpdated объекта DataAdapterraKou запрос:
Visual Basic .NET
Dim da As 01eDbDat.aAd;:ptftr = CreateMyDataAdapterO Dim As =
Dim strSQL As String = "SELECT HySequence. CURRVAL FROM DUAL"
Dim cmdGetSequence As New 01e0bCommand(strSQL, cn) AclclHancller da. RowUpdated, AddressOf HandleRowUpdated Dim tbl As DataTable = CreateMyDataTable() da.Fill(tbl) M
da.Update(tbl)
Private Sub HandleflowUpdated(ByVal sender As Object,
ByVal e As OleDbRowUpdatedEventArgs) If e. Status = UpdateStatus.Continue AnclAlso _ B.StatementType = StatementType.Insert Then e.Row("OrderID") = CType(cmdGetSequence.ExecuteScalar, Integer) a.Row.AcceptChanges() End If End Sub
Visual C# NET
OleDbDataAdapter da = CreateHyDataAdapterC); ¦OleDbConnection cn = da,SelectCommand.Connection; String StrSQL = "SELECT HySequence.CURRVAL FROM DUAL"; OleD&Command cmclGetSequence = new 01eDbCommand(strSQL, cn);
+= new
DataTable tbl = CreateMyDataTabla(); da,Fill(tbl);
da.Update(tbl);
private void HandleRowUpdated(object sender, OleDbRowUpdatedEventArgs e)
if <(e.Statu; == UpdateStatus.Ccntinua) SS ((e. StatementType == StatementType.Insert))
{
e.Row["OrderID"] = (int) cmdGetSequence.ExecuteScalarO;
416 Часть II! Автономная работа с данными: объект DataSet модели ADO NET
е.Row.AcceptChanges();
}
;i
Вам не надо использовать в запросе INSERT INTO команду Scqm-ncf.NliX'lVAI.. Обратиться к последовательности разрешается перед выполнением .ч;и ip< >сз INSERT INTO. Следующий фрагмент кода создает новую процедуру, которая выполняет запрос к последовательности для получения нового значения и помещает это значение в переменную. Затем процедура использует это значение для вставки новой записи при помощи запроса INSERT INTO.
CREATE PROCEDURE MyStoredPiос
(pOtherCol IN VARCHAR2, pID OUT NUMBER) IS BEGIN
SELECT MySequence.NEXTVAL INTO pID FROM DUAL; INSERT INTO MyTable (ID, OtherCol) VALUES (pID, pOtherCol);
END;
Хранимая процедура возвращает новое значение последовательности с использованием параметра вывода. Такую процедуру следует задать свойству ItmrfCom-»ю>Ш объекта DctiaAdaptvr чтобы ¦ новые записи. Если связать параметр
вывода с соответствующим полем объекта Пък1Г:си\ D&ds.Rcv.: получит новое значение сразу же после передачи новой записи и БД.
Примечание Помните: прямой связи между последовательностью и столбцом таблицы нет. Использовать последовательность при вставке новой записи в таблицу не требуется. Если пользователи вставляют новые записи без ссылок на последовательность, та генерирует новые значения, уже имеющиеся в БД. Во избежание проблем убедитесь, что единственный способ вставить новую запись в таблицу — вызвать хранимую процедуру. ссылающуюся на последовательность.
Генерирование фиктивных значений для объектов DataCoiumn последовательности
Последовательности не являются столбцами с знк>ннкременгом. но если задать свойству Autolncrement соответствующих объектов DataCoiumn значение True, можно заставить ADO.NET генерировать для новых записей фиктивные значения. Задавать значение свойства придется вручную. Прямой связи между последовательностью и таблицей нет. Если получить информацию схемы БД с помощью метода DaiaAduiilei:T/'HScl:та или средствами мастера Data Adapter Configuration Wizard, ADO.NET не узнает, что столбец таблицы сопоставлен с последовательностью.
Аналогичные проблемы возникают при генерации логики обновления для ¦объектов DataAdapter. Объект CommandBulldem мастер Data Adapter Configuration Wizard не узнают, что в логике, заданной свойству InsertCommand, нужно опустить соответствующий столбец. Если вы собираетесь создавать логику обновле-
ГЛАВА 1 Сложные случаи обновления данных
417
ния при помощи указанных средств, вам потребуется внести в нее ные изменения.
Может показаться, что я критикую эти утилиты. На самом деле это не так. Информации схемы, которая связывала бы столбец таблицы и последовательность, не существует, и поэтому данные утилиты делают все чтобы создать
подходящий код.
Тот факт, что поле, косвенно связанное с последовательностью Oracle, разрешено обрабатывать как поле с автоинкрементом и что можно управлять порядком выборки новых значений последовательности в объект - подтверждение мощи, предоставляемой ADO.NET разработчикам. В предыдущих моделях
Предыдущая << 1 .. 175 176 177 178 179 180 < 181 > 182 183 184 185 186 187 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100