par Rick Dobson - Mis en ligne le 16/02/2004 - Publié en Avril 2004
Un objet ADO.NET pour exécuter des commandes SQL Server
Les applications de base de données
exécutent fréquemment des instructions
SQL dynamiques et des procédures
stockées ...Les premières sont
utiles pour les opérations liées au langage
de définition de données (DDL),
par exemple la création de tables, ou
pour les opérations d'accès aux données,
telles que les requêtes ad hoc.
Les secondes constituent l'ossature de
la plupart des applications de base de
données et elles exécutent généralement
des requêtes prédéfinies, ainsi
que des mises à jour de la base de données.
SqlCommand est l'objet ADO.
NET chargé d'exécuter des instructions
SQL dynamiques et des procédures
stockées au niveau d'une base
de données SQL Server. Il est essentiel
de savoir l'utiliser pour commencer à
développer des applications ADO.
NET. Par ailleurs, la connaissance du
codage dans l'environnement Microsoft
.NET et du langage ADO.NET
représente une étape préparatoire
indispensable pour Yukon, la prochaine
version de SQL Server, car celleci
fera appel aux langages .NET pour la
création d'objets de base de données.
Cet article constitue une introduction
à l'utilisation de l'objet SqlCommand.
Il explique notamment comment l'employer
pour exécuter des instructions
DDL SQL dynamiques et passer des paramètres
à une procédure stockée, ou
encore pour exécuter une procédure
stockée et renvoyer des valeurs. Bien
que Visual Studio .NET ne soit pas absolument
indispensable pour les
exemples présentés ici, son utilisation
est nettement préférable à l'écriture
manuelle de ces programmes à l'aide
d'un éditeur de texte et du kit de développement
logiciel (SDK) .NET
Framework.
Avant de pouvoir utiliser la classe
SqlCommand (le code source servant à
créer un objet SqlCommand), vous devez
ajouter une directive d'importation
pour l'espace de nom System.
Data.SqlClient dans votre projet. La directive
d'importation permet de faire
référence de manière « abrégée » à des
classes dans l'espace de nom, de sorte
qu'il n'est pas nécessaire d'ajouter systématiquement
le préfixe System.
Data.SqlClient à chaque classe. Pour
un projet Visual Basic .NET (VB.NET),
ajoutez la ligne suivante en haut de
votre fichier source :
Imports System.Data.SqlClient
Après avoir ajouté la directive d'importation, vous êtes
prêt à utiliser les objets ADO.NET SqlCommand dans vos
projets.
Le SQL dynamique propose un mécanisme extrêmement
souple d’utilisation des bases de données relationnelles. Par
exemple, il permet d’exécuter des requêtes ad hoc et des requêtes
d’action, ou encore d’exécuter des instructions DDL
SQL afin de créer des objets de base de données. L’exemple
de sous-routine SQLCommandNonQuery du listing 1 illustre
le mode d’utilisation du SQL dynamique avec l’objet
ADO.NET SqlCommand afin de vérifier l’existence d’une
table et de créer conditionnellement la table en question si
elle n’existe pas.
La première ligne de la sous-routine passe les variables
sServer et sDB en tant que paramètres. Les valeurs de ces
deux variables spécifient le serveur de base de données SQL
Server et la base de données qui seront utilisés par l’application.
La sous-routine crée ensuite un nouvel objet ADO. NET
SqlConnection nommé cn pour connecter votre application
VB.NET à la base de données SQL Server, puis passe la chaîne
de connexion en tant que premier paramètre du constructeur
de l’objet SqlConnection. Cette chaîne utilise la sécurité
intégrée pour se connecter au serveur car ce mécanisme est
plus aisé et plus sûr.
Une fois l’objet Connection créé, la sous-routine instancie
la variable sSQL, qui contiendra les instructions SQL dynamiques,
et crée une instance de l’objet SqlCommand
nommé cmd. Dans cet exemple, le constructeur de l’objet
cmd emploie deux paramètres. Le premier est une chaîne
qui contient l’instruction SQL exécutée par la sous-routine ;
le deuxième est l’objet SqlConnection qui va se connecter au
serveur de base de données cible. Dans le cas présent, la
chaîne sSQL est initialement vide.
Ensuite, la sous-routine met en place une structure Try-
Catch pour exécuter les commandes SQL. La première action
du bloc Try-Catch dans l’encadré A du listing 1 utilise la méthode
Open de l’objet SqlConnection cn pour ouvrir une
connexion avec la base de données SQL Server spécifiée
dans la chaîne de connexion. La sous-routine affecte ensuite
à la variable sSQL une instruction SQL qui vérifie l’existence
de la table Department. Dans cette instruction, un ordre SELECT
interroge la table
sysobjects de SQL
Server afin de vérifier
l’existence d’une table
utilisateur nommée
Department. Si la requête
trouve la table en
question, la sous-routine
exécute une instruction
DROP TABLE
afin de supprimer la
table de la base de données
cible. Dans le cas
contraire, aucune action
supplémentaire
n’est effectuée.
Afin de pouvoir exécuter
l’instruction SQL,
la sous-routine affecte la
valeur de la variables
SQL à la propriété CommandText
de l’objet
SqlCommand cmd, puis
u t i l i s e l a méthode
ExecuteNonQuery de l’objet pour envoyer la commande au
système SQL Server. La méthode Execute NonQuery exécute
une instruction SQL qui ne retourne pas d’ensemble de résultats
ni de valeur spécifique ; dans ce cas, elle crée une
table. Le tableau 1 répertorie toutes les méthodes supportées
par l’objet SqlCommand pour l’exécution de commandes
SQL sur la base de données cible.
Après la première commande SQL DROP TABLE, la section
de code de l’encadré B applique la même séquence pour exécuter une commande CREATE TABLE. La sous-routine
commence par assigner à la variable sSQL une instruction
T-SQL CREATE TABLE qui crée une table à deux colonnes
nommée Department. La première colonne intitulée
DepartmentID contient des données de type Integer et
constitue également la clé primaire ; la deuxième colonne intitulée
DepartmentName contient des données du type 25-
character. Ensuite, la sous-routine copie la valeur de la variable
sSQL vers la propriété CommandText de l’objet cmd et
appelle la méthode ExecuteNonQuery pour exécuter l’instruction
CREATE TABLE. Après l’exécution de la méthode
ExecuteNonQuery, la table Department existe dans la base
de données nommée au niveau de la variable sDB. En cas
d’erreur au cours de l’une des étapes de traitement, pendant
la phase liée à la méthode Open de l’objet SqlConnection ou
pendant les instances de la méthode ExecuteNonQuery de
l’objet SqlCommand, le code du bloc Catch s’exécute et une
zone de message affiche le texte de la condition d’exception.
A la fin de la sous-routine CommandNonQuery, l’application
exécute la méthode Close de l’objet SqlConnection afin de
fermer la connexion en cours avec la base de données SQL
Server.
Dans vos applications qui exécutent des instructions SQL
dynamiques, veillez à valider toutes les saisies utilisateurs
afin de protéger votre système contre les attaques SQL par
injection, lesquelles permettent à des intrus d’accéder à vos
bases de données. Bien que cet exemple génère l’intégralité
du code SQL en interne, une pratique courante consiste à
créer les chaînes d’exécution SQL à partir de la saisie de l’utilisateur.
Si votre application applique ce principe, vous devez
tester la validité des données entrées de toutes les chaînes de
saisie et vérifier la présence de mots-clés SQL non souhaités
et de caractères significatifs tels que le point-virgule.
Téléchargez cette ressource
Guide inmac wstore pour l’équipement IT de l’entreprise
Découvrez les dernières tendances et solutions IT autour des univers de Poste de travail, Affichage et Collaboration, Impression et Infrastructure, et notre dossier Green IT sur les actions engagés par inmac wstore pour réduire son impact environnemental