extract()
此方法将 Record 组件提取到相应的 C 结构体中。
以下规则描述了如何将 C 结构体用作目标数据结构:
- C 语言结构体必须与数据库记录具有完全相同的组件,并且组件顺序也要一致。
- 所有结构体成员都使用默认对齐方式,即编译器在没有特殊对齐指令的情况下所使用的对齐方式。
- 数组组件表示为指向数组值的指针。
- 字符串组件以以空字符结尾的 ANSI 字符串形式存储。
- 如果结构中的某个组件不属于任何表,并且是某些
select
语句表达式计算的结果,则其类型由以下规则确定:
- 整型(
char
、short
、unsigned short
、int
等)表示为int64_t
类型 - 浮点型(
float
、double
)表示为 double 类型 - 其他类型保持原样表示
嵌套结构必须由相同的 C 结构体来表示
void extract(
rec,
dst,
size,
nullIndicators[] = NULL,
mode = emReferenceToBody
);
参数
rec
Record
*
要提取的Record实例。
ds!t
void
*
指向用于接收数据库记录的 C 结构体的指针。
size
size_t
C 结构体的大小。这必须与正在提取的数据库记录的大小相匹配。
nullIndicators
bool
一个Bool数组,如果对应的字段为空,则将其设置为 true
。此数组需要足够大,以收集所有记录字段的指示符。对于嵌套结构,还必须包含嵌套结构中每个字段的元素。如果未指定此数组(为 NULL
),则将导致 RuntimeException 异常。
mode
ExtractMode
用于提取结构体组件的模式。可选值
emReferenceToBody:指向数据库内部字符串主体的指针。任何结构体字段都必须具有 char* 元素。
emCopyFixedSizeStrings:复制固定大小的字符串。任何结构体字段都必须具有 char[N] 元素,其中 N 是固定大小字符串的大小。
emCloneStrings:克隆字符串组件。任何结构体文件都必须具有 char* 元素。(应用程序负责释放字符串主体(使用 delete[] 操作符)。
返回
RuntimeException
在出现错误的情况下抛出一个 RuntimeException 异常。
示例
/* 模式定义代码片段 */
class Person
{
char<64> name;
int4 age;
float weight;
tree<name> by_name;
};
/* 应用程序代码片段 */
// 定义与数据库记录“Person”相对应的结构。
struct _Person
{
char const* name;
int age;
float weight;
};
void show_results( char * sql)
{
QueryResult result(engine.executeQuery(sql));
Cursor* cursor = result->records();
while (cursor->hasNext())
{
Record* rec = cursor->next();
_Person p;
//将“Person”记录提取到相应的结构体中
result->extract(rec, &p, sizeof(p));
printf("\t\t%d) Name=%s, Ordinal=%u\n", count, p.name, p.ordinal );
}
}