http://www.mobpub.net/viewthread.php?tid=2287
主要涉及到的类: RDbs RDbStoreDatabase RDbNamedDatabase RDbTable RDbView TDbQuery …相关类很多,最笨的办法可以在Doc中分别以C、R、T + Db进行查看 RDbs代表了一个连接到DBMS 服务器的Session。 RDbStoreDatabase、RDbNamedDatabase是Symbian里面的两种数据库,两者不能通用,后者是共享型的,使用更为广泛。 范例代码如下: RDbs rdbs; RDbNamedDatabase db; User::LeaveIfError(rdbs.Connect()); User::LeaveIfError(db.Create(rdbs,_L(”C:/MyDb.db”),_L(”SECURE[0xEA3243EF]”))); //当然,也可以使用另一个Create的重载版本创建数据库文件,第一个参数是一个RFs,不过那是不加密型的数据库 db.Open(rdbs,_L(”C:/MyDb.db”),_L(”SECURE[0xEA3243EF]”)); // 建表 db.Execute(_L(”CREATE TABLE table1(id INTEGER,name VARCHAR(16))”)); // 注:RDbNamedDatabase直接提供了表/索引操作的API(如CreateTable),但是使用稍嫌麻烦,需要CDbColSet、TDbCol,不如直接使用Execute执行建表语句来得简单。但是直接使用建表SQL的坏处就是不支持事务,Execute之后直接生效,而使用CreateTable等函数后,需要调用Commit(),当然也能使用Rollback进行回滚。 // 插数据 db.Execute(_L(”INSERT INTO table1 VALUES(1,’Coastline’)”)); db.Compact(); // 查数据 RDbView dbView; TDbQuery dbQuery(_L(”SELECT * FROM table1 WHERE id=1″)); dbView.Prepare(db,dbQuery); dbView.EvaluateAll(); for(dbView.FirstL();dbView.AtRow();dbView.NextL()) { dbView.GetL(); TInt id = dbView.ColInt(1); TBuf<16> name(dbView.ColInt(1)); // do sth with id & name } // 关闭 dbView.Close(); db.Close(); rdbs.Close(); 注:以上代码缺乏数据库文件存在与否的检测等常规容错机制 Symbian中使用的SQL:(摘录+本人汉化) # ‘SELECT‘ SELECT select-list FROM table-name [ WHERE search-condition ] [ ORDER BY sort-order ] * 3 search-condition types: compare, like, null # DML : INSERT, DELETE, UPDATE INSERT INTO table-name [ ( column-identifier,… ) ] VALUES ( column-value,… ) DELETE FROM table-name [ WHERE search-condition ] UPDATE table-name SET update-column,… [ WHERE search-condition ] # DDL : Work with the schema(即数据库) CREATE TABLE table-name (column-definition,…) DROP TABLE table-name ALTER TABLE table-name { ADD add-column-set [ DROP drop-column-set ] | DROP drop-column-set } CREATE [ UNIQUE ] INDEX index-name ON table-name ( sort-specification,… ) DROP INDEX index-name FROM table-name 常用数据类型(不完整) [‘BIT’, ‘INTEGER’, ‘COUNTER’, ‘BIGINT’, ‘FLOAT’, ‘TIMESTAMP’, ‘VARCHAR(n)’, ‘LONG VARCHAR’] * COUNTER is an auto-incremented unsigned integer 即自动递增的无符号整数,获取的时候要使用ColUint()。 DBMS错误码有四种类型分别是: 1 DBMS(ud_std.h) ——————— EDbUnimplemented, 0 EDbInvalidColumn, 1 EDbUninitialised, 2 EDbRowLengthOverflow, 3 EDbTooManyKeys, 4 EDbInvalidViewWindowParameters, 5 EDbWrongType, 6 EDbInvalidIncrementalStep, 7 EDbNoColumnsInSeekKey 8 2 DBMS-Server(sd_std.h) ————————- EDbsUnimplemented, 0 EDbsInvalidColumn, 1 EDbsWrongType, 2 EDbsNoRowData, 3 EDbsNotInUpdate, 4 EDbsBadDescriptor, 5 EDbsBadHandle, 6 EDbsStreamMarkInvalid, 7 EDbsStreamLocationInvalid, 8 EDbsObserverRequestPending 9 3 DBMS-Store(us_std.h) ————————- EDbUnimplemented, 0 EDbNoStore, 1 EDbCannotSeek, 2 EDbNotFixedFieldType, 3 EDbWrongType 4 4 DBMS-Table(ut_std.h) ————————- EDbInvalidColumn, 0 EDbWrongType, 1 EDbInUpdate, 2 EDbNotInUpdate, 3 EDbInvalidRow, 4 EDbRowNotRead, 5 EDbReadOnly, 6 EDbTableOpen, 7 EDbNotEvaluated, 8 EDbStreamOpen, 9 EDbRowSetConstraintMismatch, 10 EDbBeginNestedTransaction, 11 EDbUpdatesPendingOnCommit, 12 EDbUpdatesPendingOnRollback, 13 EDbNoCurrentTransaction, 14 EDbStreamsPendingOnCommit, 15 EDbStreamsPendingOnRollback, 16 EDbInvalidBookmark 17 另外要说明的一点是:SQL语句末尾不要分号,否则执行返回错误码 -11 |