ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Введення в ADO
         

     

    Інформатика, програмування

    Введення в ADO

    1. Введення.

    ADO - інтерфейс, покликаний забезпечити клієнтське додаток доступом і можливостями маніпулювання зовнішніми даними. ADO є інтерфейсом програмного рівня до OLE DB (інтерфейсом надзвичайно зручним і високопродуктивним). ADO і OLE DB складають разом технологію Універсального доступу до даних (UDA). При цьому, будучи інтерфейсом високого рівня до OLE DB, ADO використовує OLE DB постачальники даних (на даний момент це, в основному, провайдери реляційних баз даних, хоча вже з'являються постачальники для нереляціонних джерел даних і систем електронної пошти).

    Варто відзначити, що корпорація Microsoft під публічно заявляє, що ADO найближчим часом замінить велике розмаїття моделей і технологій доступу до даних, включаючи такі методи самої Microsoft, як DAO, RDO.

    Примітка:

    Надалі в статті мається на увазі, що читач знайомий з інтерфейсами OLE DB, такими поняттями, постачальник і споживач даних, має базові знання з COM.

    Також хотілося б відзначити, що ця стаття з'явилася результатом спроби автора ретельно розібратися в технології ADO і систематизувати отримані в результаті знання (а також відомості з літ.істочніков) і, природно, стаття не може на щось претендувати (крім критики J,) тим більше на оригінальність.

    2. Об'єктна модель ADO.

    ADO складається з наступних основних компонентів:

    Об'єкти:

    Connection. ADO використовує об'єкти Connection для надання окремих сполук з джерелом даних.

    Command. Об'єкти Command використовуються для надання конкретних команд, що виконуються над джерелом даних. Ці об'єкти використовуються для відстеження параметрів, пов'язаних з командою.

    Parameter. Об'єкти Command містять колекцію Parameters, що включає всі пов'язані з командою параметри. Кожен окремий об'єкт Parameter служить для зберігання інформації про параметр, переданому в виконувану команду або повертається в ній.

    Recordset. Об'єкти Recordset забезпечують взаємодія з даними. Вони використовуються для зберігання набору записів, що повертається з джерела даних.

    Field. Об'єкти Recordset містять колекцію об'єктів Field, що використовуються для для роботи з окремими стовпчиками групи рядків.

    Property. Об'єкти Connection, Command, Recordset, Field містять колекцію Properties об'єктів Property. Об'єкти Property служать для подання додаткових параметрів або властивостей об'єкта ADO, які не можуть управлятися вбудованими властивостями об'єкта.

    Error. Призначені для представлення інформації про помилки, які можуть відбуватися в рамках однієї операції.

    Колекції:

    Fields.

    Properties.

    Parameters.

    Errors.

    3.Немного про директиву # import

    Директива препроцесора # import дозволяє автоматично створювати бібліотеку типів COM до класів С + + для COM інтерфейсів. Це дуже зручно, якщо у вас не маєте доступу до MIDL-файлів. Використання цієї директиви Visual C + + істотно спрощує роботу з об'єктами, методами і властивостями ADO.

    При включенні директиви # import препроцесор компілятора формує два заголовків файлу, що містять бібліотеку типів в вигляді вихідного тексту на С + +. Головний заголовки (з розширенням. Tlh) містить опис класів плюс оголошення інтелектуального покажчика (smart pointer - _com_ptr_t):

    _COM_SMARTPTR_TYPEDEF (INameOfInterface, __uuidof (INameOfInterface ));

    При подібному використанні макросу _COM_SMARTPTR_TYPEDEF Компілятор оголошує інтелектуальний покажчик INameInterfacePtr.

    Примітка: _com_ptr_t - шаблонний клас, інкапсулює покажчик на COM-інтерфейс. Об'єкт _com_ptr_t автоматично викликає методи інкапсульованими в ньому інтерфейсу AddRef () при створенні об'єкта і Release () при виході об'єкта з області видимості, коректно керуючи існуванням COM-об'єкта.

    Допоміжний заголовки (. tli) містить реалізацію класів бібліотеки типів.

    Директива # import має вигляд:

    # import "ім'я_файлу" [атрибути]

    або

    # import <ім'я файлу> [атрибути]

    ім'я_файлу - зазвичай файл наступних типів:. tlb,. odl, . dll,. exe,. ocx.

    атрибути:

    exclude - виключає генерується в заголовків файлах коду певні елементи або бібліотеки типів

    high_method_prefix - задає префікс, який буде ставиться на початку імен методів і властивостей верхнього рівня

    high_property_prefixes - задає префікс для стандартних імен Get, Put і PutRef, яка буде поставлена на початку імені методу при зверненні до властивості.

    implementation_only - забороняє створення основного заголовки

    include (...) - включає об'яви інших бібліотек типів, визначення яких зустрічаються в інших системних файлах

    inject_statement - поміщає рядок тексту на початку оголошення оголошення простору імен заголовки для бібліотеки типів.

    named_guides - вказує компілятору визначити і ініціалізувати змінні зі старими GUID

    no_auto_exclude - забороняє автоматичне виключення визначень елементів

    no_implementation - забороняє генерацію файлу. tli

    no_namespace - Не використовується простір імен, специфікація якого знаходиться в операторі library

    raw_dispinterfaces - вказує компілятору генерувати всі виклики методів і властивостей за допомогою функції Invoke і повертати код помилки HRESULT. Оболонки верхнього рівня не генеруються.

    raw_interfaces_only - дозволяє надати вміст бібліотеки типів тільки нижнього рівня, пригнічуючи генерацію заготовок функцій верхніх рівнів

    raw_method_prefix - приєднує до заданого імені префікс raw_, який зазвичай підключається до функцій-членів низького рівня

    raw_native_types - змушує використовувати типи даних нижнього рівня (замість _bstr_t - BSTR, замість _variant_t - VARIANT)

    raw_property_prefixes - дозволяє задати префікс нижнього рівня для методів-властивостей put, get та putref

    rename - перейменовує бібліотеку типів і запобігти повторне використання імен

    rename_namespace - вказує простір імен, що містить інформацію про бібліотеку тіпов.Ітак, після наданих роз'яснень з директиві # import, розглянемо, яким чином її (директиву) можна використовувати для включення інтерфейсів ADO в наш додаток.

    пропишемо в файл stdafx.h (наприклад) горезвісну директиву в такий спосіб:

    # import "c: Program FilesCommon FilesSystemADOmsado15.dll"

    no_namespace rename ( "EOF", "ADOEOF")

    У даному випадку створюються класи з бібліотеки типів msado15.dll, що реалізує об'єкти ADO і що поставляється в рамках OLE DB SDK.

    У параметрі rename доводиться перейменовувати ADO константу EOF, так як вона вже використовується в заголовних файлах stdio.h, ios.h, stream.h, включених до afxwin.h.

    4. Ініціалізація COM.

    Тут все просто:

    перед роботою з об'єктами ADO необхідно ініціалізувати середу COM. Робиться це за допомогою виклику API функції

    HRESULT CoInitialize (LPVOID pvReserved);

    де

    pvReserved пареметр, що дорівнює NULL.

    Для вивантаження COM застосовується функція

    void CoUninitialize ();

    5. Встановлення з'єднання з джерелом даних.

    Для цих цілей, як зазначалося вище, використовується об'єкт Connection (підключення до джерела даних і керування цим підключенням здійснюється за допомогою методів Open (), Close () об'єкта Connection). Хоча, варто помітити, що ви можете не створювати його самостійно. Можна просто дозволити ADO створити з'єднання, що використовується об'єктами Recordset і Command. Проте, вам необхідно створити об'єкт Connection, якщо передбачається управління транзакціями (для створення та управління транзакціями призначені наступні методи Connection: BeginTrans (), CommitTrans () і RoolbackTrans ()).

    Отже, створення з'єднання. Для цього робимо наступні кроки:

    1. Оголошуємо покажчик на з'єднання:

    _ConnectionPtr pConn;

    2. Створюємо об'єкт Connection за допомогою функції CreateInstance ():

    HRESULT CreateInstance (const CLSID & rclsid, IUnknown * pOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)

    де

    rclsid - CLSID об'єкта;

    pUnknown - покажчик на зовнішній інтерфейс при агрегування;

    dwClsContext - контекст запуску виконуваного коду.

    Приклад:

    HRESULT hr;

    hr = pConn.CreateInstance (__uuidof (Connection ));

    або

    hr = pConn.CreateInstance (__uuidof (Connection), NULL, CLSCTX_INPROC_SERVER);

    3. після створення екземпляра класу Connection створюємо з'єднання. З цією метою викликаємо метод Open об'єкта Connection.

    HRESULT Open (_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options = NULL);

    ConnectionString - рядок з'єднання (см.табл.1.1 і 1.2).

    UserID - ім'я користувача для підключення до джерела даних

    Password - пароль користувача

    Options - дозволяє вказати, яким чином буде здійснюватися з'єднання - синхронно (adConnectUnspecified) або асинхронно (adAsyncConnect).

    Таблиця 1.1. Вид рядка з'єднання, що передається в метод Open (...) об'єкта Connection для різних OLE DB постачальників (MSDN)        

    Джерело даних         

    Рядок з'єднання OLE DB             

    Microsoft ® Access         

    Provider = Microsoft.Jet.OLEDB.4.0; Data Source = physical path to. mdb   file             

    Microsoft SQL Server         

    Provider = SQLOLEDB.1; Data Source = path to database on server             

    Oracle         

    Provider = MSDAORA.1; Data Source = path to database on server             

    Microsoft Indexing Service         

    Provider = MSIDXS.1; Data Source = path to file     

    Таблиця 1.2. Вид рядка з'єднання, що передається в метод Open (...) об'єкта Connection для різних ODBC постачальників даних (MSDN)        

    Джерело даних         

    Рядок з'єднання ODBC             

    Microsoft Access         

    Driver = (Microsoft Access Driver (*. mdb)); DBQ = physical path to. mdb   file             

    SQL Server         

    DRIVER = (SQL Server); SERVER = path to server             

    Oracle         

    DRIVER = (Microsoft ODBC for Oracle); SERVER = path to server             

    Microsoft Excel         

    Driver = (Microsoft Excel Driver (*. xls)); DBQ = physical path to. xls   file; DriverID = 278             

    Microsoft Excel 97         

    Driver = (Microsoft Excel Driver (*. xls)); DBQ = physical path to. xls   file; DriverID = 790             

    Paradox         

    Driver = (Microsoft Paradox Driver (*. db)); DBQ = physical path to. db   file; DriverID = 26             

    Text         

    Driver = (Microsoft Text Driver (*. txt; *. csv)); = DefaultDir physical path   to. txt file             

    Microsoft Visual FoxPro ® (with a database container)         

    Driver = (Microsoft Visual FoxPro Driver); SourceType = DBC; SourceDb = physical   path to. dbc file             

    Microsoft Visual FoxPro (without a database container)         

    Driver = (Microsoft Visual FoxPro   Driver); SourceType = DBF; SourceDb = physical path to. Dbf file     

    Наступний приклад показує установку з'єднання з базою даних pubs, що входить в стандартний пакет поставки MS SQL Server 7.0 за допомогою OLE DB постачальника:

    _ConnectionPtr pConn = NULL;

    _bstr_t strConn = "Provider = sqloledb; Data Source = (local); Initial Catalog = pubs";

    try

    (

    pConn.CreateInstance (__uuidof (Connection ));

    pConn-> Open (strConn, "sa ","", adConnectUnspecified);

    )

    catch (_com_error e)

    (

    // Обробка помилок з'єднання

    )

    Примітка:

    Виключення в ADO. Для обробки виключень ADO необхідно забезпечити блок catch для об'єкта _com_error. Цей клас використовується для повернення помилок з класів, згенерованих директивою # import. Клас _com_error інкапсулює генеруються значення HRESULT і будь-які об'єкти IErrorInfo, згенеровані постачальником OLE DB.

    Приклад обробників винятків ADO:

    void PrintComError (_com_error & e)

    (

    _bstr_t bstrSource (e.Source ());

    _bstr_t bstrDescription (e.Description ());

    // Print COM errors.

    printf ( "Error ");

    printf ( "Code =% 08lx ", e.Error ());

    printf ( "Code meaning =% s ", e.ErrorMessage ());

    printf ( " Source =% s ", (LPCSTR) bstrSource);

    printf ( " Description =% s ", (LPCSTR) bstrDescription);

    )

    void PrintProviderError (_ConnectionPtr pConnection)

    (

    // Print Provider Errors from Connection object.

    // pErr is a record object in the Connection's Error collection.

    ErrorPtr pErr = NULL;

    if ( (pConnection-> Errors-> Count)> 0)

    (

    long nCount = pConnection-> Errors-> Count;

    // Collection ranges from 0 to nCount -1.

    for (long i = 0; i

    (

    pErr = pConnection-> Errors-> GetItem (i);

    printf ( "Error number:% x% s ", pErr-> Number,

    pErr-> Description);

    )

    )

    )

    За замовчуванням при встановленні з'єднання час очікування становить 15 сек. Змінити це значення можна завданням перед відкриттям з'єднання властивості ConnectionTimeout.

    Якщо потрібно обмежити доступ програми до джерела даних, перед відкриттям з'єднання необхідно встановити режим конекту (властивість Mode об'єкта Connection). Mode може містити комбінацію (порозрядне АБО) наступних значень:

    adModeRead - Тільки для читання

    adModeReadWrite - Для читання/запису.

    adModeShareDenyNone - Дозволити іншим проводити читання/запис

    adModeShareDenyRead - Заборонити іншим читання.

    adModeShareDenyWrite - Заборонити іншим запис

    adModeShareExclusive - Заборонити іншим читання/запис

    adModeUnknown - Ні дозволів (за замовчуванням)

    adModeWrite - Тільки для запису

    6. Закриття з'єднання

    Завершується робота з джерелом даних закриттям з'єднання - викликом методу Close () об'єкта Connection.

    pConn-> Close ();

    Частина 2.

    Отже, продовжимо.

    7. Набори записів.

    З'єднання з джерелом даних встановлено. Далі необхідно власне ці дані отримати і як-то ними керувати. З цією метою створюється об'єкт Recordset, який інкапсулює набір записів, що повертаються джерелом. За допомогою цього об'єкта ми зможемо додавати, видаляти, змінювати запису, в цей об'єкт включений механізм переміщень по записах в наборі даних.

    7.1. Створення набору записів.

    Об'єкт Recordset можна створити кількома способами: в результаті виконання команди (використання методу Execute () об'єкта Command або Connection), або за допомогою методу Open () безпосередньо об'єкта Recordset. Розглянемо детальніше останній варіант. Отже, метод Open ().

    HRESULT Open (const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options);

    Source - джерело вибірки (набору записів). Може бути як SQL рядок (запит), так і ім'я таблиці або збереженої процедури на SQL сервер.

    ActiveConnection - З'єднання, що використовується для створення набору записів (вибірки). Може бути передано або у вигляді рядка з'єднання (при цьому відпадає необхідність створення об'єкта Connection - ADO автоматично створює з'єднання, яке буде використано для даного об'єкта Recordset. Покажчик на таке з'єднання можна отримати за допомогою властивості об'єкта Recordset ActiveConnection), або у вигляді покажчика на вже створене активне з'єднання.

    CursorType - тип курсору для створюваного об'єкту Recordset. Може приймати одне з наступних значень:

    adOpenUnspecified - невизначений тип курсору.

    adOpenForwardOnly - односторонній курсор (значення за замовчуванням). Не підтримує методи MoveFirst () (до початку вибірки), MoveLast () (до останнього запису у вибірці), MovePrevious () (до попереднього запису у вибірці). Також не підтримує використання властивості RecordCount (кількість записів у вибірці). Чи не відстежуються зміни та доповнення, зроблені іншими користувачами.

    adOpenKeyset - курсор, керований по ключовому численности, який може вільно переміщатися і знаходить деякі види змін, внесені в строки вибірки. Число записів в такому наборі незмінно. Ви не зможете побачити доданих іншими користувачами записів, віддалені іншими користувачами записи залишаються видимі в такій вибірці, хоча і стають недоступними.

    adOpenDynamic - динамічний курсор, який може переміщатися і визначати всі зміни, внесені в дані, що містяться в вибірці. Найбільш багатофункціональний, але і найдорожчий по витраті пам'яті тип курсору.

    adOpenStatic - статичний курсор. На відміну від DAO, дозволяється модифіковані все ADO Recordset, що навіть мають курсори adForwardOnly і adOpenStatic. Проте при виборі таких курсорів для вибірки все зміни, внесені іншими користувачами для вас невидимі.

    LockType - Тип блокування, що використовується даними набором записів. Варіанти:

    adLockReadOnly - тільки читання.

    adLockPessimistic - блокує рядки, коли ви починаєте редагування (якщо постачальник підтримує даний тип).

    adLockOptimistic - блокує зміни тільки при передачі змін до БД (підтримується всіма постачальниками даних).

    adLockBatchOptimistic - використовується для пакетних операцій модифікації. Пакетна модифікація дозволяє вивантажувати безліч записів, модифікувати їх локально і відсилати зміни постачальника в одному пакеті. Большінсто провайдерів не підтримують цю блокування.

    Options - використовується для вказівки виду Source. Варіанти:

    adCmdText - текстова команда (в SQL угоді).

    adCmdTable - таблиця або подання (вона ж -- "вьюха", т.е.view).

    adCmdStoredProc - збережена процедура

    adCmdUnknown - невідомий тип (за замовчуванням).

    Ну що ж, спробуємо відкрити таблицю authors нашої багатостраждальної бази даних pubs. Попередньо ще треба визначити, чи буде курсор серверних або клієнтських. Зробимо ми це за допомогою властивості CursorLocation об'єкта Recordset (варіанти - adUseClient, adUseServer, adUseNone). Можна також обмежити число що повертаються записів (властивість MaxRecords), задавати кількість локально Кешована рядків у наборі записів (властивість CacheSize - за замовчуванням дорівнює одиниці).

    Приклад:

    _RecordsetPtr pRst;

    _bstr_t strTableName = "authors";

    pRst.CreateInstance (__uuidof (Recordset ));

    pRst-> CursorLocation = AdUseClient;

    pRst-> MaxRecords = 50;

    pRst-> CacheSize = 30;

    pRst-> Open (strTableName, _variant_t ((IDispatch *) pConn, true), adOpenDynamic, adLocjOptimistic, adCmdTable);

    7.2. Встановлення фільтра в наборі записів.

    У ADO є механізм обмеження за будь-яким критерієм що повертається набору записів - фільтрація вибірки. Саме для цілей фільтрації об'єкт Recordset має властивість Filter.

    Властивість Filter являє собою розширення запиту, заданого в параметрі Source Recordset'a. Рядок, що передається в властивість Filter, повинна мати вигляд ім'я_поля (стовпця) - Оператор - Значення, наприклад

    pRst-> Filter = "au_lname = 'White AND' au_fname LIKE 'J *'";

    ім'я_поля - ім'я стовпця з вибірки Recordset.

    Оператор - <,>, <=,> =, <>, =, або LIKE

    Значення - значення, з яким порівнюється значення поля. Причому для строкових типів даних?? наченням повинна бути укладена в одинарні лапки, для дати значення укладається між символами #. Допускається використання (як і в SQL синтаксисі) символів * та%, наприклад при використанні оператора LIKE. Також допускається застосування логічних операторів AND і OR для складання комбінованого критерію фільтрації.

    Властивість Filter також може приймати значення однієї з нижчеперелічених констант:

    adFilterNone - Відміняє поточне значення властивості Filter.

    adFilterPendingRecords - У режимі пакетної модифікації (см.ниже) це значення можна використовувати для вибору тільки з тих рядків, які були змінені, але ще не модифіковані в базі даних.

    adFilterAffectedRecords - Вибирає рядки, для яких виконувалася остання операція Delete (), Resync (), UpdateBatch (), CancelBatch ().

    adFilterFetchedRecords - вибирає рядки, які в даний час утримуються в локальному буфері.

    7.3. Доступ до даних набору записів.

    Інформацію про рядках (записах) можна отримати, використовуючи об'єкти Field колекції Fields створеного і відкритого Recordset'a.

    Колекція Fields містить дві властивості:

    Count - кількість стовпців у вибірці (більше правильно, звичайно говорити про кількість об'єктів Field в колекції Fields).

    Item - надає доступ (повертає посилання) до об'єкту Field на ім'я або порядковим номером, тобто вам стають доступні такі властивості об'єкта Field, як ім'я поля, розмір, тип і значення поля.

    Покажемо це все на прикладі:

    int nNumFields = pRst-> Fields-> Count;

    for (int i = 0; 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

    (

    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

    (

    _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) для режимів невідкладної модифікації та пакетної, відповідно.

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.realcoding.net/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status