TSDBQuery
| TSDBQuery = class (TObject) | Interface de TSDBQuery | Exemples de TSDBQuery |
Description de la classe TSDBQuery
Cette classe permet d'établir une connexion avec une base de données externe et d'exécuter des requêtes SQL dans cette base.
Pour simplifier la connexion, il est recommandé de se connecter à une base de données définie dans les sources de données SQL de Qubes (Admin > Connectivité > Sources de données SQL).
Rappel: les connexions à la base Qubes ou QubesArchive sont hors contrat, et peuvent entraîner une invalidation de la garantie et de la maintenance Qubes.
Injection SQL
Il s'agit d'une faille très dangereuse, qui est possible si un attaquant peut modifier librement le texte d'une requête SQL.
Cela ne peut arriver que si un script reçoit des chaînes de caractères issues d'une entrée utilisateur et les insère directement dans le texte de la requête via une concaténation de chaîne... ce qu'il ne faut donc jamais faire !
Il faut toujours utiliser des paramètres SQL via les fonctions dédiées (ex : StringParam).
Transactions
Pour garantir des écritures cohérentes dans une base de données, il faut utiliser des transactions.
Pour cela, on démarre une transaction par la méthode TSDBQuery/StartTransaction.
On peut ensuite faire des requêtes de lecture (TSDBQuery/Open) ou d'écriture (TSDBQuery/ExecSQL).
Les écritures sont alors marquées dans la base de données, mais ne sont pas encore validées (et donc pas visibles par les autres transactions).
Pour valider ces écritures, on utilise la méthode TSDBQuery/Commit.
Pour les annuler, on utilise la méthode TSDBQuery/RollBack.
Si une erreur se produit, par exemple si on veut écrire dans une table qui n'existe pas, la démarche la moins risquée est de faire un TSDBQuery/RollBack.
Pour cela, on recommande d'utiliser un bloc Langage/TryExcept (cf. exemple ci-dessous).
Attention : Certaines bases de données (notamment Oracle en fonction des réglages appliqués) ne génèrent d'exception qu'au moment du TSDBQuery/Commit et non au moment de l'écriture provoquant une erreur (sur un TSDBQuery/ExecSQL par exemple).
Dans ce cas, on ne passe dans le bloc Except qu'au moment du Commit, et non dès la ligne générant l'erreur.
Pour éviter ces situations, on peut utiliser un TSDBQuery/SavePoint.
Exemples
sdbQuery.StartTransaction;
try
// ...
// ... traitements dans la base de données (ExecSQL par exemple)
// ...
sdbQuery.Commit; // Validation de la transaction
except
sdbQuery.RollBack; // Annulation de la transaction en cas d'exception
raise;
end;