- 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
Vincular datos a parámetros de consulta: DatabaseBind/Array
Después de que la consulta SQL haya sido compilada por la función DatabasePrepare puede utilizar el manejador de consulta recibido para vincular datos a los parámetros de consulta, que es para lo que sirven las funciones DatabaseBind y DatabaseBindArray. Ambas funciones pueden invocarse no sólo inmediatamente después de crear una consulta en DatabasePrepare, sino también después de restablecer la solicitud a su estado inicial con DatabaseReset (si la solicitud se ejecuta muchas veces en un bucle).
El paso de vinculación de datos no siempre es necesario porque las consultas preparadas pueden no tener parámetros. Por regla general, esta situación se produce cuando una consulta devuelve datos de SQL a MQL5, y por lo tanto se requiere un descriptor de consulta: cómo leer los resultados de la consulta por sus manejadores se describe en las secciones sobre las funciones DatabaseRead/DatabaseReadBind y DatabaseColumn.
bool DatabaseBind(int request, int index, T value)
La función DatabaseBind establece el valor del parámetro index para la consulta con el manejador request. De manera predeterminada, la numeración empieza por 0 si los parámetros de la consulta están marcados con símbolos de sustitución '?' (sin número). Sin embargo, los parámetros pueden especificarse en la cadena de consulta y con un número (?1, '?5', ?21): en este caso, los índices reales que se pasen a la función deben ser 1 menos que el número correspondiente de la cadena. Esto se debe a que la numeración de la cadena de consulta empieza por 1.
Por ejemplo, la siguiente consulta requiere un parámetro (índice 0):
int r = DatabasePrepare(db, "SELECT * FROM table WHERE id=?");
|
Si se utilizara la sustitución «... id=?10» en la cadena de consulta, sería necesario llamar a DatabaseBind con el índice 9.
El value en el prototipo DatabaseBind puede ser de cualquier tipo simple o cadena. Si un parámetro necesita asignar datos de tipo compuesto (estructuras) o datos binarios arbitrarios que puedan representarse como un array de bytes, utilice la función DatabaseBindArray.
La función devuelve true si tiene éxito. En caso contrario, devuelve false.
bool DatabaseBindArray(int request, int index, T &array[])
La función DatabaseBindArray establece el valor del parámetro index como un array de tipo simple o de estructuras simples (incluidas cadenas) para la consulta con el manejador request. Esta función permite escribir BLOB y NULL (la ausencia de un valor que se considera un tipo independiente en SQL y no es igual a 0) a la base de datos.
Ahora volvamos a la clase DBQuery en el archivo DBSQLite.mqh y agreguemos compatibilidad con vinculación de datos.
class DBQuery
|
BLOB es adecuado para transferir cualquier archivo a la base de datos sin cambios; por ejemplo, si primero lo lee en un array de bytes utilizando la función FileLoad.
La necesidad de vincular explícitamente un valor nulo no es tan obvia. Al insertar nuevos registros en la base de datos, el programa de llamada suele pasar sólo los campos que conoce, y todos los que falten (si no están marcados con la restricción NOT NULL o no tienen un valor DEFAULT diferente en la descripción de la tabla) serán automáticamente dejados igual a NULL por el motor. No obstante, cuando se utiliza el enfoque ORM, es conveniente escribir todo el objeto en la base de datos, incluido el campo con una clave primaria única (PRIMARY KEY). El nuevo objeto aún no tiene este identificador, ya que la propia base de datos lo añade cuando el objeto se escribe por primera vez, por lo que es importante vincular este campo en el nuevo objeto al valor NULL.