单独读取字段:DatabaseColumn 函数
通过 DatabaseRead 或 DatabaseReadBind 函数执行查询后,程序便有机会滚动浏览根据指定条件选择的记录。在每次迭代中,SQLite 引擎的内部结构中会分配一个特定的记录,该记录的字段(列)可通过 DatabaseColumn 函数组访问。
int DatabaseColumnsCount(int request)
根据查询描述符,该函数返回查询结果中的字段(列)数。如果出错,则返回 -1。
你甚至可以找出在 DatabasePrepare 中创建的查询的字段数量(在调用 DatabaseRead 函数之前)。对于其他 DatabaseColumn 函数,你通常应首先调用 DatabaseRead(至少一次)。
使用查询结果中字段的原始编号,程序可以找出字段名称 (DatabaseColumnName)、类型 (DatabaseColumnType)、大小 (DatabaseColumnSize) 以及相应类型的值(每种类型都有其对应的函数)。
bool DatabaseColumnName(int request, int column, string &name)
该函数用查询结果 (request) 中由编号 (column) 指定的列的名称填充通过引用传递的字符串参数 (name)。
字段编号从 0 开始,不能超过 DatabaseColumnsCount() - 1 的值。这不仅适用于此函数,也适用于本节所有其他函数。
该函数成功时返回 true,如果出错则返回 false。
ENUM_DATABASE_FIELD_TYPE DatabaseColumnType(int request, int column)
DatabaseColumnType 函数返回查询结果当前记录中指定列的值的类型。可能的类型收集在 ENUM_DATABASE_FIELD_TYPE 枚举中。
标识符 |
说明 |
---|---|
DATABASE_FIELD_TYPE_INVALID |
获取类型错误,错误代码在 _LastError |
DATABASE_FIELD_TYPE_INTEGER |
整数 |
DATABASE_FIELD_TYPE_FLOAT |
实数 |
DATABASE_FIELD_TYPE_TEXT |
字符串 |
DATABASE_FIELD_TYPE_BLOB |
二进制数据 |
DATABASE_FIELD_TYPE_NULL |
空值(特殊类型 NULL) |
关于 SQL 类型及其与 MQL5 类型的对应关系的更多细节已在 表结构(模式):数据类型和限制一节中介绍过。
int DatabaseColumnSize(int request, int column)
该函数返回 request 查询结果当前记录中具有 column 索引的字段值的字节大小。例如,整数值可以用不同数量的字节表示(我们从 MQL5 类型中知道这一点,特别是 short/int/long)。
下一组函数允许你从记录的相应字段中获取特定类型的值。要从下一条记录中读取值,你需要再次调用 DatabaseRead。
bool DatabaseColumnText(int request, int column, string &value)
bool DatabaseColumnInteger(int request, int column, int &value)
bool DatabaseColumnLong(int request, int column, long &value)
bool DatabaseColumnDouble(int request, int column, double &value)
bool DatabaseColumnBlob(int request, int column, void &data[])
所有函数成功时都返回 true,并将字段值放入 value 接收变量中。唯一的特例是 DatabaseColumnBlob 函数,它传递一个任意简单类型或简单结构体的数组作为输出变量。通过指定 uchar[] 数组作为最通用的选项,你可以读取任何值的字节表示(包括使用 DATABASE_FIELD_TYPE_BLOB 类型标记的二进制文件)。
SQLite 引擎不会检查是否为列调用了与其类型相对应的函数。如果类型无意或有意不同,系统将自动隐式地将字段值转换为接收变量的类型。
现在,在熟悉了大多数 Database 函数之后,我们可以完成 DBSQLite.mqh 文件中一组 SQL 类的开发,并继续演示实际示例。