Fonctionnalités pour simplifier l'utilisation du SQL avec Qt

| Harald Fernengel | traducteur : charlespf | Qt Quarterly |

La première partie de l'article présente la nouvelle syntaxe des requêtes paramétrées de Qt pour simplifier le passage à l'Unicode et des données binaires. La seconde montrera comment cette nouvelle version facilite le déploiement des applications utilisant les bases de données. La troisième partie décrira une alternative aux DSN ODBC.

Commentez ♪

- Titre : Fonctionnalités pour simplifier l'utilisation du SQL avec Qt

- Auteurs : Harald Fernengel, traducteur : charlespf, Qt Quarterly

- Parution : 6 mai 2012

- Mise à jour : 8 mai 2012

- Licence : Copyright ® 2002 Nokia. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. L'article original

- II. Requêtes paramétrées

- III. Déploiement d'applications bases de données

- III-A. Lien statique pour Unix/Linux et Mac

- III-B. Lien statique pour Windows

- IV. Utilisation d'ODBC sans DSN

- V. Conclusion

- VI. Remerciements

I - L'article original

Qt Quarterly est une revue trimestrielle électronique proposée par Nokia à destination des développeurs et utilisateurs de Qt. Vous pouvez trouver les versions originales.

Nokia, Qt, Qt Quarterly et leurs logos sont des marques déposées de Nokia Corporation en Finlande et/ou dans les autres pays. Les autres marques déposées sont détenues par leurs propriétaires respectifs.

Cet article est une traduction de l'article original écrit par Harald Fernengelparu dans la Qt Quarterly Issue 4.

Cet article est une traduction de l'un des tutoriels en anglais écrits par Nokia Corporation and/or its subsidiary(--ies), inclus dans la documentation de Qt. Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia.

II - Requêtes paramétrées

Les instructions standards SQL telles que DELETE, INSERT, UPDATE, SELECT, etc. fonctionnent bien pour des petits morceaux de texte encodés en Latin-1, mais souffrent deux limitations majeures :

- la plupart des serveurs de bases de données requièrent l'utilisation de macros spécifiques pour insérer des données binaires ou Unicode, car ils n'acceptent que des caractères encodés en Latin-1 ;

- certains serveurs imposent une longueur maximale des requêtes ce qui limite le nombre des données qui leur sont passées.

Qt résout ces problèmes avec les requêtes paramétrées. Au lieu d'insérer les données dans la requête, des espaces réservés sont utilisés et les données sont transférées dans un flux binaire au serveur. Ceci réduit la charge de travail pour le serveur et le client, puisque les valeurs ne sont pas traduites.

Il n'y a pas d'approche standard au paramétrage. La solution de Qt est de supporter les deux méthodes les plus utilisées, le « paramétrage par position » et le « paramétrage par nom », pour toutes les plateformes et bases de données supportées. Qt émule cette fonctionnalité lorsque les bases de données sous-jacentes ne les fournissent pas, pour s'assurer que le code Qt est indépendant de la plateforme.

Le paramétrage par position utilise le point d'interrogation « ? » comme espace réservé et les valeurs sont assignées en utilisant leur index. Cette méthode est facile à utiliser, mais, si l'on insère un nouvel espace réservé, les index de tous les espaces réservés vont changer. Le paramétrage par nom donne à chaque espace réservé un nom. Ceci est plus pratique que le paramétrage par position, car le fait d'ajouter un espace réservé ne change pas l'affectation des autres espaces et l'utilisation des noms donne un code plus propre. Voici un exemple de paramétrage par position :

query.prepare( "INSERT INTO atable (id, name) VALUES (?, ?)" );
query.bindValue( 0, 1001 );
query.bindValue( 1, "Harry" );
query.exec();

Le même exemple, mais avec des paramètres nommés :

query.prepare( "INSERT INTO atable (id, name) VALUES (:id, :name)" );
query.bindValue( ":id", 1001 );
query.bindValue( ":name", "Harry" );
query.exec();

Des nouvelles lignes peuvent être ajoutées simplement en paramétrant les nouvelles valeurs et en réexécutant la requête. On ne doit appeler la méthode QSqlQuery::prepare() qu'une seule fois, la requête étant sauvée avant l'insertion.

III - Déploiement d'applications bases de données

Chaque système de gestion de bases de données utilise son propre protocole propriétaire pour la communication de bas niveau entre le client et le serveur. Les plug-ins de bases de données Qt dépendent des bibliothèques clientes des bases de données pour établir les connexions. Habituellement, elles doivent être installées sur chaque machine qui exécute l'application Qt. Ceci peut causer des problèmes si la machine cliente dispose de bibliothèques clients incompatibles ou n'en dispose pas du tout. Ces problèmes peuvent être évités en liant statiquement les bibliothèques clientes avec les plug-ins SQL de Qt. Ceci a l'inconvénient de créer des plug-ins plus gros en termes de taille, l'avantage étant que seuls les plug-ins utilisés par l'application doivent être déployés.

III-A - Lien statique pour Unix/Linux et Mac

Au lieu de passer l'objet partagé via le paramètre -l, il est possible d'inclure la bibliothèque statique au plug-in SQL en ajoutant le chemin complet et le nom du fichier .a. Pour compiler le plug-in PostgreSQL avec GCC, il faudra remplacer « -L/chemin/vers/psql » -lpq par « /chemin/vers/psql/libpq.a » -lcrypt -lresolve -lnsl. Pour MySQL, remplacer « -L/chemin/vers/mysql » -lmysqlclient par « /chemin/vers/mysql/libmysqlclient.a » -lz -lcrypt -lnsl -lm. Les fichiers .a sont juste des ensembles de fichiers objets, ils sont nécessaires pour satisfaire les dépendances externes (que l'on peut découvrir en utilisant l'arbre des bibliothèques). Pour trouver quelles sont les dépendances, utiliser la commande ldd sur l'objet partagé de la bibliothèque client, par exemple ldd libpq.so.

III-B - Lien statique pour Windows

Le lien statique sous Windows est facile. Pour MySQL, au lieu de lier avec libmysql.lib, lier avec mysqlclient.lib. Ces fichiers se trouvent dans le même répertoire. Utiliser les dépendances de MSVC pour être sûr qu'il n'y a pas de dépendance avec mysql.dll. Une approche similaire fonctionne avec les autres bibliothèques clientes.

IV - Utilisation d'ODBC sans DSN

Dans Qt 3.0, une connexion ODBC requiert un DSN (Data Source Name - nom d'une source de données) configuré dans le gestionnaire de connexions ODBC. Dans Qt 3.1, cette limitation n'existe plus. Au lieu de passer un nom DSN, on peut passer le nom du pilote et le nom du serveur comme nom de base de données en utilisant la syntaxe suivante : DRIVER={pilote};SERVER=serveur. Le pilote doit être un pilote ODBC valide et le serveur doit être un hôte. On note que tous les gestionnaires de connexions ODBC ne supportent pas cette syntaxe.

V - Conclusion

Cet article a été rédigé en 2002 avec Qt 3.

Néanmoins, ces indications sont toujours valables dans Qt 4 avec notamment l'utilisation des requêtes paramétrées et du déploiement d'applications bases de données.

VI - Remerciements

Au nom de toute l'équipe Qt, j'aimerais adresser le plus grand remerciement à Nokia pour nous avoir autorisés à traduire cet article !

Je tiens à remercier Thibaut Cuvelier pour ses conseils et Maxime Gault pour sa relecture.