- Principios de las operaciones de base de datos en MQL5
- Conceptos básicos de SQL
- Estructura de las tablas: tipos de datos y restricciones
- POO (MQL5) e integración SQL: concepto de ORM
- Crear, abrir y cerrar bases de datos
- Ejecutar consultas sin enlace de datos MQL5
- Comprobar si una tabla existe en la base de datos
- Preparar consultas vinculadas: DatabasePrepare
- Borrar y reiniciar consultas preparadas
- Vincular datos a parámetros de consulta: DatabaseBind/Array
- Ejecutar consultas preparadas: DatabaseRead/Bind
- Leer campos por separado: funciones DatabaseColumn
- Ejemplos de operaciones CRUD en SQLite mediante objetos ORM
- Transacciones
- Importar y exportar tablas de bases de datos
- Imprimir tablas y consultas SQL en registros
- Ejemplo de búsqueda de una estrategia de trading mediante SQLite
Leer campos por separado: funciones DatabaseColumn
Como resultado de la ejecución de la consulta mediante las funciones DatabaseRead o DatabaseReadBind, el programa tiene la oportunidad de desplazarse por los registros seleccionados según las condiciones especificadas. En cada iteración, en las estructuras internas del motor SQLite se asigna un registro específico, cuyos campos (columnas) están disponibles a través del grupo de funciones DatabaseColumn.
int DatabaseColumnsCount(int request)
Basándose en el descriptor de la consulta, la función devuelve el número de campos (columnas) en los resultados de la consulta. En caso de error, devuelve -1.
Puede averiguar el número de campos de la consulta creada en DatabasePrepare incluso antes de llamar a la función DatabaseRead. Para otras funciones de DatabaseColumn debe llamar inicialmente a DatabaseRead (al menos una vez).
Utilizando el número original de un campo en los resultados de la consulta, el programa puede encontrar el nombre del campo (DatabaseColumnName), el tipo (DatabaseColumnType), el tamaño (DatabaseColumnSize) y el valor del tipo correspondiente (cada tipo tiene su función).
bool DatabaseColumnName(int request, int column, string &name)
La función rellena el parámetro de cadena pasado por referencia (name) con el nombre de la columna especificada por número (column) en los resultados de la consulta (request).
La numeración de los campos comienza en 0 y no puede superar el valor de DatabaseColumnsCount() - 1. Esto se aplica no sólo a esta función, sino también a todas las demás funciones de la sección.
La función devuelve true si tiene éxito, o false en caso de error.
ENUM_DATABASE_FIELD_TYPE DatabaseColumnType(int request, int column)
La función DatabaseColumnType devuelve el tipo del valor de la columna especificada en el registro actual de los resultados de la consulta. Los tipos posibles se recopilan en la enumeración ENUM_DATABASE_FIELD_TYPE.
Identificador |
Descripción |
---|---|
DATABASE_FIELD_TYPE_INVALID |
Error al obtener tipo, código de error en _LastError |
DATABASE_FIELD_TYPE_INTEGER |
Número entero |
DATABASE_FIELD_TYPE_FLOAT |
Número real |
DATABASE_FIELD_TYPE_TEXT |
Cadena |
DATABASE_FIELD_TYPE_BLOB |
Datos binarios |
DATABASE_FIELD_TYPE_NULL |
Vacío (tipo especial NULL) |
Se ofrecieron más detalles sobre los tipos SQL y su correspondencia con los tipos MQL5 en la sección Estructura (esquema) de las tablas: tipos de datos y restricciones.
int DatabaseColumnSize(int request, int column)
La función devuelve el tamaño del valor en bytes para el campo con el índice column en el registro actual de resultados de la consulta request. Por ejemplo, los valores enteros pueden ser representados por un número diferente de bytes (lo sabemos por los tipos MQL5, en concreto, short/int/long).
El siguiente grupo de funciones permite obtener el valor de un tipo concreto a partir del campo correspondiente del registro. Para leer los valores del siguiente registro, hay que volver a llamar a 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[])
Todas las funciones devuelven true en caso de éxito y ponen el valor del campo en la variable receptora value. El único caso especial es la función DatabaseColumnBlob, que pasa un array de un tipo simple arbitrario o estructuras simples como variable de salida. Especificando el array uchar[] como la opción más versátil, puede leer la representación en bytes de cualquier valor (incluidos los archivos binarios marcados con el tipo DATABASE_FIELD_TYPE_BLOB).
El motor SQLite no comprueba que para una columna se llame a una función correspondiente a su tipo. Si los tipos, de forma inadvertida o intencionada, son diferentes, el sistema convertirá automática e implícitamente el valor del campo al tipo de la variable receptora.
Ahora, tras familiarizarnos con la mayoría de las funciones de Database, podemos completar el desarrollo de un conjunto de clases SQL en el archivo DBSQLite.mqh y pasar a los ejemplos prácticos.