7.3. Доступ к данным набора записей.

Информацию о строках (записях) можно получить, используя объекты Field коллекции Fields созданного и открытого Recordset'a.

Коллекция Fields содержит два свойства:

Count - количество столбцов в выборке (более правильно, конечно говорить о количестве объектов Field в коллекции Fields).

Item - предоставляет доступ (возвращает ссылку) к объекту Field по имени или порядковому номеру, т.е. вам становятся доступны такие свойства объекта Field, как имя поля, размер, тип и значение поля.

Покажем это все на примере:

int nNumFields = pRst->Fields->Count;

for(int i=0;i<nNumFields;i++)

{

_bstr_t strName = pRst->Fields->Item[(_variant_t)I]->Name;

_bstr_t strValue = pRst->Fields->Item[(_variant_t)I]->Value;

TRACE(" %S = %S (тип: %d) ", (LPCTSTR)strName, (LPCTSTR) strValue, (short) pRst->Fields->Item(_variant_t)I]->Type);

}

//Или то же самое, но с созданием объектов FieldsPtr и FieldPtr

FieldsPtr pFields;

FieldPtr pField;

pFields= pRst->Fields;

int nNumFields = pFields->Count;

for(int i=0;i<nNumFields;i++)

{

pField = pFields->GetItem((_variant_t)i);

_bstr_t strName =pField->Name;

_bstr_t strValue = pField->Value;

TRACE(" %S = %S (тип: %d) ", (LPCTSTR)strName, (LPCTSTR) strValue, (short) pField->Type);

}

В примере мы выводим данные о полях одной записи (по умолчанию это первая строка выборки). Рассмотрим методы перемещения по выборке данных.

Чтобы перейти к первой строке набора записей можно применить метод MoveFirst() объекта Recordset. Методы MoveNext(), MoveLast() и MovePrevious() позволяют перемещаться по выборке, соответственно, к следующей записи, к последней и предыдущей (если эти перемещения допускает тип курсора).

Объект Recordset имеет свойства EOF и BOF (название свойства EOF мы изменили при подключении msado15.dll - см.выше), которые позволяют определить, что при перемещении по набору записей достигнута последняя (EOF) или первая (BOF) запись. Происходит это следующим образом: если при перемещении по выборке достигнута первая запись, то при следующем вызове MovePrevious() свойство BOF приобретает значение TRUE, аналогично, если позиционирована последняя запись, то при использовании MoveNext() значение TRUE приобретает свойство EOF объекта Recordset.

Пример:

int nNumFields = pRst->Fields->Count;

while(!pRst->ADOEOF){

for(int i=0;i<nNumFields;i++)

{

_bstr_t strName = pRst->Fields->Item[(_variant_t)I]->Name;

_bstr_t strValue = pRst->Fields->Item[(_variant_t)I]->Value;

TRACE(" %S = %S (тип: %d) ", (LPCTSTR)strName, (LPCTSTR) strValue, (short) pRst->Fields->Item(_variant_t)I]->Type);

}

pRst->MoveNext();

}

Также для перемещения по выборке данных можно воспользоваться методом

HRESULT Move(long NumRecords, const _variant_t &Start = vtMissing);

Знаковое целое NumRecords показывает, на сколько записей необходимо переместится по выборке (если NumRecords > 0, то переместиться вперед, если NumRecords < 0, то назад).

Параметр Start задает начальное положение указателя текущей записи (если Start = 0, то перемещение произойдет относительно текущей записи, иначе в Start надо передавать так называемую закладку

(Значение закладки для текущей строки можно получить из свойства Bookmark выборки. Если сохранить это значение в какой-либо переменной, то потом его можно присвоить свойству Bookmark и снова сделать эту строку текущей. Проверить, что набор записей поддерживает закладки можно с помощью метода Support() объекта Recordset.)

на требуемую начальную запись).

ADO Recordset позволяет производить так называемый постраничный просмотр выборки. Для этого необходимо свойстве в PageSize объекта Recordset указать количество строк, составляющих одну страницу. При этом из свойства PageCount можно узнать о количестве страниц в выборке.

7.4. Модификация данных.

Вставка строк в Recordset осуществляется посредством методов AddNew() и Update().

Метод AddNew() непосредственно добавляет новую строку (и делает ее текущей) в наборе записей.

HRESULT AddNew(const _variant_t & FieldList, const _variant_t &Values);

FieldList - массив имен или номеров инициализируемых в строке полей.

Values - массив инициализирующих значений для этих полей.

Далее строку можно модифицировать с помощью объектов коллекции Fields (если это необходимо), после чего изменения можно сохранить в базе данных, вызвав метод Update() (если при вызове метода AddNew() в него передавались инициализирующие значения, Update() вызывать не надо).

HRESULT Update(const _variant_t &FieldList, const _variant_t &Values);

Как видно из определения, в Update(…), так же как и в AddNew(…) можно передавать массив имен (или номеров) модифицируемых полей и новые значения.

Пример добавления записи:

pRst->AddNew();

pRst->Fields->Item["au_lname"]->Value = _bstr_t("Усов");

pRst->Fields->Item["au_fname"]->Value = _bstr_t("Виталий М.");

pRst->Update();

Удалить запись в наборе записей можно с помощью метода Delete(…) объекта Recordset.

HRESULT Delete(enum AffectEnum AffectRecords);

AffectRecords принимает одно из следующих значений:

adAffectCurrent - удалить текущую строку(по умолчанию)

adAffectGroup - удаляет все строки, удовлетворяющие критерию свойства Filter.

adAffectAll - удаляет все записи.

adAffectAllChapters - удаляет все записи главы. (ссылка на диапазон строк источника данных. Как правило, ссылка на другой Recordset. Глава позволяет реализовать отношения наследник-родитель между объектами Recordset.)

Если Recordset находится в режиме непосредственного редактирования, то помеченные строки удаляются немедленно в источнике данных. Если же применяется режим пакетной модификации (наконец-то и до него дошли), то строки удалятся после вызова метода UpdateBatch().

Что же такое "режим пакетной модификации"??? Все очень просто - некоторые поставщики данных позволяют кэшировать выборки локально, вносить в них изменения и потом передавать всю выборку (или изменения в ней) источнику данных одновременно в одном пакете (а не по одной строке). Как отмечалось выше, для использования пакетной модификации необходимо при создании объекта Recordset использовать флаг adLockBatchOptimistic. Для передачи изменений в выборке источнику данных в пакетном режиме необходимо вызвать метод

HRESULT UpdateBatch(AffectEnum AffectRecords);

Где AffectRecords:

adAffectCurrent - обновить текущую строку(по умолчанию)

adAffectGroup - обновить все строки, удовлетворяющие критерию свойства Filter.

adAffectAll - обновить все записи.

adAffectAllChapters - обновить все записи главы. (ссылка на диапазон строк источника данных. Как правило, ссылка на другой Recordset. Глава позволяет реализовать отношения наследник-родитель между объектами Recordset.)

Если после модификации данных вы решили отменить изменения, сделать это можно с помощью методов CancelUpdate() и CancelBatch(AffectEnum AffectRecords) для режимов неотложной модификации и пакетной, соответстве


Информация о работе «Введение в ADO»
Раздел: Информатика, программирование
Количество знаков с пробелами: 25509
Количество таблиц: 2
Количество изображений: 0

Похожие работы

Скачать
35963
32
2

... /загружать в/из файла. Его можно сохранять/загружать в/из текстовой строки. Он может загружать данные из объекта Record или какого-либо ресурса по URL. Его можно клонировать. Для иллюстрации работы с объектом Stream приведу-таки пример на VB6, который сохраняет изображение в файл без использования инструкции Put: Dim stream As New ADODB.stream 'Тип потока - бинарный stream.Type = ...

Скачать
31935
18
6

... string Company;  public string Phone;  public string Fax;  // Для отложенной загрузки списка заказов необходимо перейти  // от использования ArrayList к использованию специального класса из  // ObjectSpaces – ObjectList.  public ObjectList Orders = new ObjectList(); } public class Order {  private int _orderID = 0;  public int OrderID  { get {return _orderID;} ...

Скачать
114140
0
0

... данных базы и их представление. С помощью встроенных средств и инструментов базы данных создается пользовательский интерфейс, позволяющий управлять процессами ввода, хранения, обработки, обновления и представления информации базы данных.[2] 4 ЭТАПЫ РАЗРАБОТКА ПРОГРАММНОГО ПРОДУКТА Данная программа создана для учета успеваемости студентов. Для работы с программой необходимо нужные группы или ...

Скачать
79258
97
1

... форматами поддерживает OLE DB Persistence Provider. Кроме сохранения, можно также загружать (восстанавливать) объект Recordset из файлов. Сохранение и последующая загрузка рекордсета из файла в формате XML дали возможность использования XML-документов в качестве баз данных. OLE DB Persistence Provider жестко задает формат результирующего XML-документа: для описания структуры и типов узлов всегда ...

0 комментариев


Наверх