IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Exemple d'architecture à 3 couches en Visual Basic

Le 17 mars 2003

Par Romain Puyfoulhoux

Sommaire

1. Exemple d'application classique
2. Rôle de chacune des couches
3. Avantages de cette architecture
4. Exemple d'architecture à 3 couches
   4.1 Couche données
   4.2 Couche métier
   4.3 Couche présentation


4.1 Couche données

Cette couche aura donc la forme d'une dll ActiveX. Pour créer ce type de projet, cliquez sur le menu Fichier -> Nouveau projet, puis sur DLL ActiveX. Allez dans les propriétés du projet et saisissez "Data" pour le nom du projet. La classe Class1 a été créée par défaut, renommez-la en clsData. Ce sera la seule classe contenue dans cette couche.

La classe clsData doit pouvoir : ouvrir une connexion à la base de données, et renvoyer un recordset déconnecté à partir d'une requête passée en paramètre.

Option Explicit

Public Enum DataErrorEnum
    dtErrorConnexion = 4000
    dtErrorOpenRecordset = 4001
    dtErrorGeneral = 4002
End Enum

Private m_baseDeDonnees As String
Private m_chaineDeConnexion As String

Private Sub Class_Initialize()

  m_baseDeDonnees = App.Path & "\db.mdb"
  m_chaineDeConnexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & m_baseDeDonnees & _
                      ";Persist Security Info=False"
End Sub

Nous avons tout d'abord une énumération qui représente les numéros d'erreurs qui peuvent être créées par cette classe. Ces erreurs peuvent être signalées à la couche métier. La procédure Class_Initialize() est exécutée à l'initialisation de la classe. C'est à ce niveau que nous initialisons les variables qui contiennent les paramètres de notre connexion.

Private Function CreeConnexion() As ADODB.Connection

  Dim cnn As ADODB.Connection

  On Error GoTo fail
  Set cnn = New ADODB.Connection
  cnn.Open m_chaineDeConnexion
  Set CreeConnexion = cnn
  Exit Function
  fail:
  Err.Raise dtErrorConnexion, "Data.clsData", _
            "La connexion à la base de données a échoué." & vbCrLf & Err.Number & ": " & Err.Description
End Function

Private Function CreeRecordset(sql As String) As ADODB.Recordset

  Dim cnn As ADODB.Connection, rst As ADODB.Recordset

  On Error GoTo fail

  Set cnn = CreeConnexion()

  Set rst = New ADODB.Recordset
  rst.CursorLocation = adUseClient
  rst.Open sql, cnn, adOpenForwardOnly, adLockReadOnly
  Set rst.ActiveConnection = Nothing

  cnn.Close
  Set cnn = Nothing

  Set CreeRecordset = rst
  Exit Function

  fail:
  Select Case Err.Number
      Case dtErrorConnexion:
          Err.Raise dtErrorConnexion, "Data.clsData", Err.Description
      Case Else
          Err.Raise dtErrorOpenRecordset, "Data.clsData", _
            "L'ouverture d'un recordset a échoué." & vbCrLf & Err.Number & ": " & Err.Description
  End Select

End Function

La fonction CreeConnexion() instancie un objet ADODB.Connection, se connecte à la base de données et renvoie l'objet instancié.

La fonction CreeRecordset() crée puis renvoie un recordset déconnecté, le code sql de la requête devant être passé en paramètre.
Nous renvoyons un recordset déconnecté, car un recordset connecté qui est transféré sur le réseau, conserve avec lui toutes les informations nécessaires pour rester lié à sa source de données.

Pour que le recordset soit déconnecté, vous devez :

  • Donner à la propriété CursorLocation la valeur adUseClient, et ceci avant d'ouvrir le recordset. Ainsi le curseur sera géré du côté client.
  • Donner à la propriété ActiveConnection la valeur Nothing, après l'ouverture du recordset. Cela a pour effet de déconnecter le recordset de sa source de données.
En utilisant cette méthode, le recordset est transféré du serveur vers le client, morceau par morceau. Il faut donc plusieurs allers-retours entre le serveur et le client pour que le recordset soit totalement transféré, ce qui n'est pas l'idéal. Ceci peut-être encore amélioré en utilisant les composants RDS pour accéder aux données. Pour plus d'informations sur RDS, voir la
documentation sur MSDN.

Ici la valeur choisie pour le "locktype" du recordset est adLockReadOnly, parce que les enregistrements n'ont pas besoin d'être modifiables par le client.

[ Précédent ] [ Suivant ]

Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.