Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 12:06, 28 October 2007.

DBMS (СУБД) API

From Forum Nokia Wiki

Перевод с английского, оригинальная статья находится здесь.


Contents

Введение

DBMS (Database Menagement System) API - Система Управления Базами Данных (СУБД). DBMS предоставляет функции для создания и управления базами данных (БД), а также обеспечивает надежный и защищенный доступ к этим данным как с помощью C++ функций и так и с помощью SQL запросов. Запросы в DBMS поддерживают механизм транзакций. Благодаря механизму транзакций вы можете быть уверены, что все вносимые вами изменения будут исполнены, или ни одно из них не вступит в силу.

DBMS в Symbian OS является мощной, но не ресурсоемкой системой. Она поддерживает как язык запросов SQL, так и язык определения данных DDL. Встроенные C++ функции предоставляют функциональность для добавления, поиска, извлечения, изменения и удаления записей.

Создание базы данных

Создание Базы данных с помощью RDbStoreDatabase Следующий пример кода демонстрирует создание базы данных с помощью RDbStoreDatabase. В нем создается объект File Store (файловое хранилище данных) и БД в нем.

class CBookstoreDb : public CBase
{
...
private: // Члены класса
RFs iFsSession;
RDbStoreDatabase iBookstoreDb;
CFileStore* iFileStore;
...
};
TInt CBookstoreDb::CreateDbL(const TFileName& aNewBookstoreFile)
{
User::LeaveIfError(iFsSession.Connect());
// Создаем новый или заменяем существующий файл
iFileStore = CPermanentFileStore::ReplaceL(iFsSession,
aNewBookstoreFile, EFileRead|EFileWrite);
iFileStore->SetTypeL(iFileStore->Layout());
TStreamId id = iBookstoreDb.CreateL(iFileStore);
iFileStore->SetRootL(id); //Поместим id базы данных в корень хранилища
iFileStore->CommitL(); //Подтверждаем изменения в хранилище
... // Теперь БД открыта и готова к операциям с ней.

Примечание: Функция CreateDbL создает новый файл базы данных. Она принимает аргумент типа TFileName, содержащий абсолютное (включая путь) имя файла. В примере, любой существовавший файл с таким именем будет перезаписан функцией ReplaceL(). В конце примера создается root stream (корневой поток) объект и изменения структуры базы данных подтверждаются.


Создание базы данных с помощью RDbNamedDatabase Следующий пример кода демонстрирует создание базы данных с помощью RDbNamedDatabase. Этот пример более простой, поскольку отсутствует необходимость работы с потоками:

...
RFs iFsSession;
RDbNamedDatabase iBookstoreDb;
...
TInt CBookstoreDb::CreateDbL(const TFileName& aNewBookstoreFile)
{
User::LeaveIfError(iFsSession.Connect());
// Create new or replace existing database
User::LeaveIfError(iBookstoreDb.Replace(fsSession,
aNewBookstoreFile));
... // База данных открыта. Создаем таблицы и т.д.

Примечание: Метод Replace создаст новый файл базы данных или заменит существующий. В файле создается пустая база данных. После этого база данных открывается и готова к созданию таблиц, индексов и пр. При создании базы данных, клиент получает исключающие права доступа к ней (доступ др. клиентов блокируется). Функция Replace принимает аргумент типа TFileName, содержащие полное имя файла (вместе с путем).

В Symbian OS DBMS, длина имя базы данных DBMS ограничена 64 символами. Имя базы данных соответствует имени файла, в котором она создана. Использование расширения в имени файла не обязательно. К примеру, следующие имена правильны:

_LIT(KDbName,"C:\\system\\apps\\bookstoredb\\bookstore.dat");
_LIT(KDbName,"C:\\system\\apps\\bookstoredb\\bookstore");

Создание таблиц в базе данных

Для создания таблицы, разработчик должен быть знаком с тремя ключевыми понятиями: атрибут (столбец таблицы), множество атрибутов и индексный ключ. Индексный ключ инкапсулирован в CDbKey. Ключевой атрибут таблицы инкапсулирован в TDbKeyCol. Определение атрибута в TDbCol.


Схема базы данных

DBMS предоставляет функции для доступа к структуре базы данных (индексам, таблицам и пр.). Базовый класс базы данных RdbDatabase содержит следующие функции:

• TableNamesL(): Список имен всех таблиц, инкапсулированных в CDbTableNames.

• IndexNamesL(): Список имен всех индексов, инкапсулированных в CDbIndexNames. В качестве аргумента требует имя таблицы.

• ColSetL(): Определение столбцов таблицы, инкапсулированных в CDbColSet. В качестве аргумента требует имя таблицы.

• KeyL(): Определение индексного ключа для индекса таблицы. Метод принимает в качестве аргументов имена таблицы и индекса. Определения столбцов CDbColSet таблицы также могут быть получены из таблицы или ее отображения с помощью метода их базового класса RdbRowSet::ColSetL(). Переход от записи к записи в CdbColSet осуществляется с помощью методов этого же класса, либо с помощью класса TdbColSetIter.



Открытие и закрытие базы данных

База данных может быть открыта с исключающими (exclusive) правами (режим одного клиента) или с разделенными (shared) правами (клиент-серверный режим). RDbNamedDatabase поддерживает оба режима, а RDbStoreDatabase позволяет открыть базу только в режиме одного клиента.

Рекомендуется использовать RDbNamedDatabase API. Доступ в режиме одного клиента немного быстрее, но в этом случае база окажется недоступной для других программ, т.к. файл базы данных будет заблокирован. Для большинства случаев рекомендуется использовать доступ в клиент-серверном режиме.


Создание данных

Создание новой записи в таблице базы данных включает в себя следующие шаги: добавление пустой записи, изменение данных в ней и подтверждение внесенных изменений. table.InsertL() добавляет новую запись, а table.SetCol(...) позволяет изменить в ней данные. Если типом столбца является EDbColLongText8, EDbColLongText16 или EDbColLongBinary - то для изменения данных в нем следует использовать RDbColWriteStream.


Ссылки

Related Discussions
Thread Thread Starter Forum Replies Last Post
need help about DBMS lengyuecau General Symbian C++ 2 2006-04-12 08:35
file format of contact database hooner General Symbian C++ 2 1970-01-01 02:00
Access Denied Error and a DBMS 2 Panic kiranpuranik General Symbian C++ 0 2004-05-13 11:18
database rajesh1410 General Symbian C++ 3 2007-01-16 09:09
e32db.open() names need \\ not / maht0x0r Python 0 2005-01-10 22:14
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX