Page ASP et bases de données

Le composant Database Access (appelé aussi ADO pour ActiveX Data Objects) permet de manipuler (lecture/écriture/mise à jour) des bases de données à travers des connexions directes ou des sources de données ODBC comme une base de données MS Access, un fichier MS Excel, une base de données SQL Server, Oracle, MySQL...

Connexion à la base de données

Connexion directe

La connexion directe à un SGBD utilise le protocole natif de connexion de ce SGBD. A titre d'exemple, pour réaliser une connexion directe à un serveur MS SQL server s'exécutant sur une machine de nom sql.domaine.com, on devra préciser à quelle "database" on souhaite accéder et préciser le nom d'utilisateur ("uid") et la mot de passe qui nous a été communiqué par l'administateur de la base de données. On obtiendrait ainsi le code asp suivant :

<%strCnn = "driver={SQL Server};server=sql.domaine.com;uid=s;pwd=xx;database=a"

Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open strCnn%>

Cette solution présente l'inconvénient majeur d'être complétement dépendante du SGBD choisi. On lui préfèrera donc l'utilisation de connexions ODBC.

Connexion à l'aide d'une source de données ODBC

Dans le cas d'une connexion ODBC, on devra utiliser le nom de connexion fourni par l'administrateur du serveur Web, ainsi que le nom d'utilisateur et le mot de passe fourni par l'administrateur de la base de données (ce n'est pas forcément la même personne). Par exemple :

<%Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open "Bibli","etd","etd"%>

Le code qui précède suppose que le webmestre a créé sur la machine qui abrite le serveur Web un lien ODBC système vers la source de données choisie (dont il convient naturellement de posséder le driver). 

Remarque : Comme un serveur de production contiendra de nombreuses pages faisant appel à la base de données, il sera raisonnable de créer un fichier contenant la chaîne de connexion (et souvent d'autres fonctions auxiliaires) que l'on inclura en tête de fichier grâce à une ligne du type :

<!--#include file="../../Common/include.inc"-->

De plus, il sera nécessaire pour travailler de disposer d'un accès commode sur la base de données. Ceci pourra être fait à l'aide d'un client natif ou d'un client de type MS-Access à travers un lien ODBC. La page en lien décrit pas à pas les étapes de la création d'une source de données ODBC.

Accès à la base de données

Les quelques exemples qui suivent montrent l'essentiel de ce qu'il faut savoir pour utiliser une base de données dans des pages asp. Le reste n'est qu'algorithmique classique ...

Afficher le contenu d'une table

Le petit exemple qui suit réalise une connexion directee à une base de données contenant des informations sur des écrivains et affiche la liste des auteurs dont le nom commence par la lettre C (Affichage de la page) :

<%Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open "Bibli","etd","etd"%>

<html>

<head>

<title>Recherche des auteurs</title>

</head>

<body>

<h1>Auteurs dont le nom commence par C</h1>

<ul>

<% Req = "Select Nom, Prénom, Nationalité from Auteur where Nom like 'C%'"

    Set R = Conn.execute(Req)

    Do while not R.eof %>

        <li> <%=R("Nom")&" "&R("Prénom")&" "&R("Nationalité")%></li>

        <%R.MoveNext

    Loop%>

<ul>

<%R.Close%>

</body>

</html>

Comme on peut le constater, le code utilisé, écrit en VBScript est tout à fait simple. On commence par construire la chaîne de caractères contenant la requête SQL (du SQL dynamique en l'occurence) que l'on demande à l'objet connexion d'exécuter. Le résultat est renvoyé sous forme d'une liste de lignes R que l'on parcourt à l'aide de la primitive R.MoveNext, jusqu'à R.eof. La syntaxe de l'itération, Do while ... Loop est parfaitement transparente.

La principale difficulté est la construction d'une requête dynamique correcte.

Les données peuvent être utilisées pour construire un formulaire ou une liste permettant d'accès à d'autres pages. Exemple.

Insertion de données dans une table

La base de données utilisée en exemple comporte deux tables accessibles en modification, la table Lecteur et la table Preter. La procédure stockée

sp_column lecteur

fournit la liste des colonnes de la table (l'indication identity fournie pour le champ Code_lecteur indique que celui-ci est incrémenté automatiquement par SQLServer) : 

COLONNE

TAILLE

TYPE

Code_lecteur

4

int, identity

Nom

12

varchar

Prénom

12

varchar

Adresse

12

varchar

Code_Postal

12

varchar

Ville

12

varchar

Date_Naissance

11

datetime

NumCB

12

varchar

TelPerso

12

varchar

Mot_Passe

12

varchar

Code

4

int

ID

4

int

ID_Num

4

int


On peut alors utiliser un formulaire simple pour saisir un nom grâce au code suivant :

<html>

<head>

<title>Nouvelle page 1</title>

</head>

<body>

<form method="POST" action="inscrit.asp">

<p>Nom du lecteur <input type="text" name="Nom" size="20"></p>

<p><input type="submit" value="Envoyer" name="B1">

  <input type="reset" value="Rétablir" name="B2"></p>

</form>

</body>

</html>

 La réponse est (pour l'essentiel) obtenue par le code suivant comportant une requête dynamique, i.e. construite à l'aide des données envoyées par le formulaire :

<html>

<head>

<title>Inscription</title>

</head>

<body>

<% NomLecteur = Request.Form("Nom")

    strCnn = "driver={SQL Server};server=tpweb.info.prive;uid=etd;pwd=etd;database=BibliSQL"

    Set Conn = Server.CreateObject("ADODB.Connection")

    Conn.Open strCnn

    Req = "Insert into Lecteur (nom) values ('"&NomLecteur&"')"

    Conn.Execute(Req)

    Conn.close%>

<h1>Inscription</h1>

Le lecteur de nom <%=NomLecteur%> a bien été enregistré dans la base grâce à la requête <%=Req%>

</body>

</html>

L'information transmise par le champ Nom du formulaire est récupérée grâce à l'appel Request.Form("Nom") On notera qu'il est impossible de saisir deux fois le même nom dans la base.