S60平台:使用DBMS APIs —在DBMS中使用SQL语言

 4、在DBMS中使用SQL语言
4.1 SQL与本地C++应用程序接口
通过使用一个“本地”C++API和API 调用的SQL语句,Symbian系统的DBMS支持很多操作。在很早的版本中,对SQL的支持仅限于选择语句;私有本地C++API提供了许多方法,用于操作数据库。目前,对SQL的支持丰富了很多。从开发者的观点来看,字面上的意思可以被理解为大多数操作可以通过两种方法完成。
总的来说,使用SQL的代码是简单的,其执行速度也很快,这就是SQL受欢迎的原因。但是,对于SQL的使用,存在一些限制。例如,长事务,压缩操作,恢复操作以及二进制列的更新操作需要使用C++ API。此外,对大量数据的SQL插入操作比使用等价的C++ API 要慢。
需要指出的是,从一开始,DBMS引擎就不支持完全的SQL操作;其仅面向有限资源设计,因此其不具有执行基于服务器SQL的能力。虽然受到这种限制,SQL的执行效果在面向日益变化的移动设备需求上已足够强大。

 !提示:本地与SQL DBMS语句两者在特定环境下都可能有一些优点或缺点,并且一些操作仅可通过其中一种方式来完成。开发人员需要留意这个现象,并且为其应用程序预计的耗费而定制解决方案。关于特性的更多特征可以在Symbian 网站上的SDK文档中获取。
在Symbian系统的DBMS中,SQL语句清晰的传递给SQL引擎,举个例子,C++代码传递一个带有串的描述符,从而获取解释用的整个SQL语句。

4.2  选择语句的细目
做为经常使用的SQL语句,本节将详细介绍选择语句的一些细节。在此,仅从透明性的角度看,不带有Symbian系统DBMS成员函数代码所嵌入的SQL语法占据的篇幅较大。4.3节,“支持SQL子集”,给出了相关语句语法项目的完全细目。

选择语句将返回一个可以获取真实行数据的行集。这类选择语句有以下基本格式:
SELECT select-list FROM table-name [ WHERE search-condition ] [ ORDER BY sort-order ]
select-list 有两种格式。指定符*以未定义顺序返回表中的所有行给行集。指定一个逗号分离列表将定义将返回哪行以及它们的具体顺序给行集。

table-name关联于数据库中已存在的表。
search-condition定义一些条件,使一行与行集合中数据相匹配。其包含Boolean型的下列操作:
Boolean-term[或 search-condition] 例如,
a=1 OR NOT b=2 AND c=3
一个查询条件可以由一个单一谓词定义;更复杂的搜索由使用AND,OR和NOT的复合谓词组成,圆括号用于限定这些操作的次序。如果不是用括号,谓词优先级是NOT,AND,最后是OR。
因此,
a=1 OR NOT b=2 AND c=3
等价于:
(a=1 OR ((NOT b=2) AND c=3))

  !提示:在SQL中,等号并不是赋值运算符。
一个search-condition 同样使用RDbRowSet::FindL() 和 RDbRowConstraint::Open(),通过使用RDbRowSet::FindL()可以确定行集的哪一行将被返回,使用RDbRowSet::MatchL()来确定匹配行。
谓词用于组建搜索条件的块。有三种类型:comparison,like,和null;每种都会对选定表中的列条件进行测试。
一个comparison谓词与带有文字值得列值相比较。列comparison是类型独立的,所以其对应的语句必须有相同的类型,数字列进行数字性比较,文本列进行词汇比较,日期列进行历史性比较。。二进制列无法进行比较。
Like谓词被用于决定一个文本列是否与模式串相匹配。可参看函数TDesc::Match()的说明。
Null谓词用于测试一列是否是空的。其适用于所有列类型。
在选择语句中,Sort-order由ORDER BY来定义。如果该子句没有使用,所展示的行顺序也是也是未定义的。使用Sort-order的列可以增序(缺省)或降序来获取数据,使用降序时,行序号虽行数增加而递减。
一个嵌入式选择语句的例子是:
_LIT(KSQLStatement,"SELECT Author, Title FROM Books WHERE Author = ’Brown, Dale’ ORDER BY Author, Title");
...
User::LeaveIfError(view.Prepare(iBookDb, TDbQuery(KSQLStatement,
EDbCompareNormal)));
...
这里是_LIT宏,其装载了完整的SQL语句,并将其装入KSQLStatement描述符中,作为TDbQuery()的一个参数而使用。
  !提示:RDbView类使用Select语句来获知哪些数据在行集中以及如果将这些数据显示出来。查询语句被传递给RDbView::Preare(),做为其的参数,并被包裹在TDbQuery对象中。

4.3 支持SQL子集
下列列表
显示了SQL子集在Symbian系统得DBMS中执行的情况。

项   目                                 说   明
add-column-set                   add-column-spec | ( add-column-spec,… )
add-column-spec                 列定义数据类型
boolean-factor                     [ NOT boolean-primary ]
boolean-primary                  谓词 | ( 查找条件 )
boolean-term                       boolean-factor [ AND boolean-term ]
column-definition               列定义数据类型[ NOT NULL ]
column-identifier                用户定义名
column-value                      literal | NULL
comparison-operator          < | > | <= | >= | = | <>
comparison-predicate          列定义 比较操作 逐字操作
data-type                          BIT | [ UNSIGNED ] TINYINT | [ UNSIGNED ] SMALLINT | [ UNSIGNED ] INTEGER | COUNTER | BIGINT | REAL | FLOAT | DOUBLE [ PRECISION ] | DATE | TIME | TIMESTAMP | CHAR [ (n) ] | VARCHAR [ (n) ] | LONG VARCHAR | BINARY [ (n) ] | VARBINARY [ (n) ] | LONG VARBINARY
date-literal                        #{数据表达式}#
                                         提示:日期时间表达式可由 TTime::Parse()转化.
digit                                  0 | 1 | 2 | ... 8 | 9
drop-column-set              列定义 | ( column-identifier,… )
index-name                      用户定义名
letter                                a | b ... y | z | A | B ... Y | Z
like-predicate                   列定义 [ NOT ] LIKE 类型值
literal                                串值 | 数字型 | 日期型

 

项   目 
说   明

null-predicate  
列标示符 IS [ NOT ] NULL  
 

numeric-literal  
{数字类型}

提示: 数字类型可由 Tlex::Val(TInt64&) 与Tlex::Val(TReal&)解析 
 

pattern-value  

提示: 当使用通配符时,DBMS使用文件协定而非SQL标准字符作为模式掩码:

? 代表任意一个字符 ,*代表任意长度的字符。 相应地,标准SQL使用下划线(_)和百分号(%)。 
 

predicate  
比较谓词 | 相似谓词 | 空谓词  
 

search-condition  
Bool 量 [ OR 查询条件 ]  
 

select-list  
* | 列定义符,…  
 

sort-specification  
列定义符 [ ASC | DESC ]  
 

string-literal  
'{字母}’

提示: Character strings can contain any text character. Single quote characters can be embedded by using two consecutive single quote characters (‘’). “”字符串可以容纳任意文本属性,但一的查询字可以通过两个””来获得 
 

table-name  
用户定义名  
 

update-column  
列定义值r = column-value  
 

user-defined-name  
字母[ 字母 | 数字 | _ ]...  
 

 

 

4.4  使用TDbQuery 类
该类的设计目的是传递一些能够容纳SQL的描述符,用以替代缺省组织方式为普通文本比较的TDbQuery对象。例如,在下列代码片断中:
_LIT(KSQLStatement ="SELECT Author, Title FROM Books WHERE Author LIKE 'BR*'");
RDbView dbview;
view.Prepare(iBookDb, KSQLStatement);
the view.Prepare statement is functionally equivalent to:
view.Prepare(iBookDb, TDbQuery(KSQLStatement, EDbCompareNormal));
为了确定其他比较类型,查询对象必须安规定格式定义,例如:
view.Prepare(iBookDb, TDbQuery(KSQLStatement, EDbCompareFolded));

4.5 SQL架构与数据更新
可以通过使用SQL命令对SQL架构和数据进行修改,DBMS接口中等价的函数为RDbDatabase和RDbIncremental。
提示:使用SQL语句可能不能完成本地DBMS API所提供的全部功能。
4.5.1 数据库定义语言(DDL)
DDL被用来修改数据库中的高级功能;这些功能包括在数据库中创建和删除表以及索引。
DDL语句不能在数据库中修改数据;然而,当一个表被删除时,表名下的所有数据都丢失了。删除一个索引即简单的移除了通过该索引获取特殊的表数据的能力。
4.5.1.1 创建表语句
CREATE TABLE table-name (column-definition,…)
4.5.1.2 删除表语句
DROP TABLE table-name
4.5.1.3 修改表语句
ALTER TABLE table-name { ADD add-column-set [ DROP drop-column-set ] | DROP drop-column-set }
4.5.1.4 创建索引语句
CREATE [ UNIQUE ] INDEX index-name ON table-name ( sort-specification,… )
4.5.1.5 删除索引语句
DROP INDEX index-name FROM table-name

4.5.2 SQL 数据跟新语言(DML)
DML语言可在列级修改数据库,用法包括行插入操作,删除操作以及更新操作。
DML语句可以修改数据库中已经存在的数据内容。
4.5.2.1 插入语句
INSERT INTO table-name [ ( column-identifier,… ) ] VALUES ( column-value,… )
4.5.2.2 删除语句
DELETE FROM table-name [ WHERE search-condition ]
4.5.2.3 更新语句
UPDATE table-name SET update-column,… [ WHERE search-condition ]

4.5.3 例子
使用DDL或DML语句最简单的方法是执行RdbDatabase。如果操作耗时太长,推荐使用增量方法(参见第5章,“增量数据库操作”)。
下列代码片断简要显示了数据库架构与数据的更新:
private: // 数据成员
RDbStoreDatabase iBookDb; // 可以用 RDbNamedDatabase 替换
...
TInt CBookDb::AddDateColumn()
{
_LIT(KSqlAddDate, "ALTER TABLE Books ADD PublishDate DATE");
return iBookDb.Execute(KSqlAddDate);
}
TInt CBookDb::DropBooksTable()
{
_LIT(KSqlDropBooks, "DROP TABLE Books");
return iBookDb.Execute(KSqlDropBooks);
}
TInt CbookDb::DeleteAllBooks()
{
_LIT(KSqlDeleteAllBooks, "DELETE FROM Books");
return iBookDb.Execute(KSqlDeleteAllBooks);
}
// 删除以F-letter名字起始的书。
TInt CbookDb::DeleteFBooks()
{
_LIT(KSqlDeleteFBooks, "DELETE FROM Books where
Title like ‘F*’");
return iBookDb.Execute(KSqlDeleteFBooks);
}
TInt CBookDb::UpdateBookTitle(const TDesC& aOldTitleKey,
const TDesC& aNewTitle)
{
_LIT(KSQLUpdateStart, "UPDATE Books SET Title = '");
_LIT(KSQLUpdateMiddle, "' WHERE Title = '");
_LIT(KSQLUpdateEnd, "'");
// SQL: UPDATE Books SET Title = ‘aNewTitle’
// WHERE Title = ‘aOldTitleKey’
TBuf<KCustomSqlMaxLength> sqlStr;
sqlStr.Append(KSQLUpdateStart);
sqlStr.Append(aNewTitle);
sqlStr.Append(KSQLUpdateMiddle);
sqlStr.Append(aOldTitleKey);
sqlStr.Append(KSQLUpdateEnd);
return iBookDb.Execute(sqlStr);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值