SmartESQL
SmartESQL是作为预先构建的库中的一组紧凑的 C++ 类实现的,这些库提供对SmartEDB数据库的SQL访问。
快速开始
通常,数据库参数将在类McoSqlOpenParameters 的实例中指定,然后调用类 McoSqlEngine 的open()
方法来初始化SQL引擎,该引擎通过executeQuery()
和executeStatement()
方法用于所有SQL数据库访问。
SQL C++ SDK示例中演示了这些类的用法。
对于大多数 SmartESQL C++ 应用程序,其主要类为 McoSqlEngine 和 QueryResult。
- 调用 McoSqlEngine 的
open()
和close()
方法来打开和关闭数据库; - 调用
executeStatement()
方法来执行 SQL 的插入、更新和删除语句; - 调用
executeQuery()
方法来执行返回 QueryResult 的选择语句。 - 使用各种 QueryResult 方法来处理结果集。
数据库定义
对于 C++ 应用程序,与 C 应用程序一样,数据库本身在外部模式文件中定义,并由 mcocomp 编译以生成特定模式的数据库接口文件,这些文件将包含在我们的 C++ 项目中。对于此示例应用程序,我们将使用模式文件 schema.mco
,如下所示:
declare database persondb;
class Person
{
string name;
unsigned<4> ordinal;
autoid[1000];
tree<name> pk;
};
我们运行 mcocomp 来编译指定 -hpp
和 -sql
选项的模式,具体操作如下:
SmartEDB/host/bin/mcocomp -hpp -sql schema.mco
应用程序源文件 main.cpp
中将包含生成文件 persondb.h
。生产的 persondb.c
将被编译并链接到我们的应用程序中。
打开数据库
要打开数据库以进行 SQL 访问,我们首先实例化一个 McoSqlEngine 对象 engine,以便调用其 open()
方法。
McoSqlEngine 类的 open()
方法有三个重载版本。
将调用 engine.close()
方法来终止数据库实例。到目前为止,main.cpp
的示例代码如下所示:
#include "persondb.h"
const char * db_name = "persondb";
#define DATABASE_SIZE 100 * 1024 * 1024
#define MEMORY_PAGE_SIZE 256
int main(int argc, char* argv[])
{
McoSqlEngine engine;
engine.open(
db_name, // 用于标识数据库的字符串
persondb_get_dictionary(), // 从 persondb.c 编译得到的模式的二进制形式
DATABASE_SIZE, // 数据和索引可用的总内存
MEMORY_PAGE_SIZE // 内存访问的基本单位
);
// 数据处理代码
engine.close();
}
写入和查询数据库
为了写入数据库,我们通过调用 engine.executeStatement()
方法执行一些 SQL 插入语句,如下所示:
engine.executeStatement("insert into Person values('Luke Skywalker', 0)");
engine.executeStatement("insert into Person values('Han Solo', 1)");
为了查询数据库,我们在 QueryResult 对象 result
的构造函数中调用 engine.executeQuery()
:
QueryResult result( engine.executeQuery("select * from Person") );
进一步开发
嵌入式SQL应用程序将使用SmartEDB DDL定义其数据库模式,使用mcocomp为所有C和C++应用程序编译模式。应用程序将使用静态C API函数启动SmartEDB运行时并指定内存设备。
处理 SQL 查询
提供了 QueryResult、Cursor 和 Record 这几个类用于处理查询结果。
通常,通过调用 McoSqlEngine 的 executeQuery()
方法并传入一个 select 语句来实例化一个 QueryResult 对象以获取结果集;然后通过 QueryResult 的 results()
方法创建一个 Cursor 对象,该对象用于遍历结果集。Cursor 的导航函数 first()
、next()
、last()
和 prev()
用于定位游标并获取当前结果集行的 Record 实例。
执行 SQL 语句
McoSqlEngine 方法 executeStatement()
会使用插入、更新或删除语句来修改数据库内容。
预处理语句
SQL 语句可以被准备并多次重复使用。这通过消除每次执行语句时的语句编译步骤节省了处理器时间。一个更显著的优势在于,准备步骤仅绑定其语句参数一次,然后在后续计算中重复使用这些参数。这可能会产生显著的影响,因为与 executeQuery()
和 executeStatement()
方法不同,prepare()
仅使用参数的指针。因此,在准备步骤中绑定参数的值,这样 executePreparedQuery()
或 executePreparedStatement()
方法就可以使用这些语句参数的实际值。
示例
请使用以下链接查看类或功能的实现细节:
功能/类 | 说明 |
---|---|
McoSqlEngine类 | McoSqlEngine 类的使用说明及关键方法 |
McoDistributedSqlEngine类 | McoDistributedSqlEngine 类的使用说明 |
McoSqlOpenParameters类 | 设置持久型或混合型数据库的 McoSqlOpenParameters 指令 |
SqlAggregator类 | SqlAggregator 类的使用说明 |
内存分配 | 使用 StdAlocator 和 QuotaSysAllocator 内存分配类的说明 |
可用内存阈值 | 设置 SQL 操作的可用内存阈值的说明 |
事务管理 | 管理数据库事务的说明 |
查询结果处理 | 处理从 executeQuery() 方法返回的 QueryResult 对象的说明 |
预处理语句 | 执行预编译语句 |
批量插入 | C++ API 中的“批量插入”优化 |
用户定义函数 | 在动态加载库中创建用户定义函数(UDF) |
结构、数组和字符串 | 结构体、数组、字符串、二进制数据、动态数据和引用的使用说明 |
字符串、数学及用户定义函数 | 使用内置的字符串和数学函数以及用户自定义函数的说明 |
聚合函数 | 使用聚合函数的说明 |
分组语句 | 使用Group By 子句的说明 |