Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Classes personnalisées

2 réponses
Avatar
Patrick
Bonjour,

J'ai créé une classe qui sert à gérer tout ce qui concerne l'interaction
avec une base de données. Elle se base bien sûr sur ADO mais possède d'autres
propriétés et méthodes. Mon problème concerne les recordsets. J'aimerais que
le code qui utilise cette classe puisse utiliser plusieurs recordsets. Par
défaut, la classe contient un recordset qui contiendra le résultat des
requêtes demandées par le code qui utilise la classe. Mais j'aimerais que le
code qui utilise la classe puisse avoir plusieurs recordsets d'ouverts en
même temps. Savez-vous comment je devrais créer la classe pour que cela soit
possible ?

L'objectif de cette classe est que le code qui l'utilise n'ait jamais besoin
de créer des objets recordsets.

J'espère que mes explications sont claires.

Merci pour votre aide.

--
Patrick

2 réponses

Avatar
Jean-marc
Patrick wrote:
Bonjour,

J'ai créé une classe qui sert à gérer tout ce qui concerne
l'interaction avec une base de données. Elle se base bien sûr sur ADO
mais possède d'autres propriétés et méthodes. Mon problème concerne
les recordsets. J'aimerais que le code qui utilise cette classe
puisse utiliser plusieurs recordsets. Par défaut, la classe contient
un recordset qui contiendra le résultat des requêtes demandées par le
code qui utilise la classe. Mais j'aimerais que le code qui utilise
la classe puisse avoir plusieurs recordsets d'ouverts en même temps.
Savez-vous comment je devrais créer la classe pour que cela soit
possible ?

L'objectif de cette classe est que le code qui l'utilise n'ait jamais
besoin de créer des objets recordsets.

J'espère que mes explications sont claires.



Hello,

C'est un classique. Il y a plusieurs façons de faire. Le plus simple est de
créer non pas un (1) recordset dans ta classe mais un "pool" de recordsets.

Au niveau implémentation, c'est simplement un tableau de recordsets.
Pour les utilisateurs de ta classe, tu crées 2 méthodes publiques, l'une
permettant
d'"allouer" un recordset en lui donnant un nom logique, l'autre methodes
permettant
de "libérer" le recodset.

Tu dois aussi créer des fonctions permettant de manipuler chaque recordset
(mettre
du SQL, récupérer les résultats, etc.).

Je ne sais pas si je suis clair, sans doute pas trop :-(

Voici un moreceau de code, avec les méthodes pour créer (en fait juste
réserver
le nom), puis ouvrir:

Private Const MAX_RS As Long = 100

Private Type EasyRecordset
rs As ADODB.Recordset
logicalname As String
End Type

Private TRecordset(MAX_RS) As EasyRecordset

Public Function CreateRs(ByVal name As String) As Boolean
Dim i As Long

' trouve une place libre
For i = 1 To MAX_RS
If TRecordset(i).logicalname = "" Then
TRecordset(i).logicalname = name
CreateRs = True
Exit For
End If
Next i
End Function

Public Function OpenRs(ByVal name As String) As Boolean
Dim i As Long

For i = 1 To MAX_RS
If TRecordset(i).logicalname = name Then
Set TRecordset(i).rs = New ADODB.Recordset
TRecordset(i).rs.Open
found = True
OpenRs = True
Exit For
End If
Next i

End Function

Il ne te reste plus qu'à créer sur le même modèle
le CloseRs (qui fermera et resetera le logicalname pour faire de la
place)
le RSSetSql(), etc. en fonction de tes besoins.

C'est très simple à utiliser ensuite depuis l'extérieur, l'utilisateur ne
devant jouer qu'avec des noms logiques, sans savoir qu'il manipule
des recordset, des cursor et tout ça.

Bonne continuation!

Cordialement;


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Patrick
Bonjour,

Merci pour tes explications. C'est tout à fait clair, d'autant plus que
j'avais envisagé cette façon de faire mais je ne savais pas trop comment la
réaliser.

Bonne journée.

--
Patrick


"Jean-marc" wrote:

Patrick wrote:
> Bonjour,
>
> J'ai créé une classe qui sert à gérer tout ce qui concerne
> l'interaction avec une base de données. Elle se base bien sûr sur ADO
> mais possède d'autres propriétés et méthodes. Mon problème concerne
> les recordsets. J'aimerais que le code qui utilise cette classe
> puisse utiliser plusieurs recordsets. Par défaut, la classe contient
> un recordset qui contiendra le résultat des requêtes demandées par le
> code qui utilise la classe. Mais j'aimerais que le code qui utilise
> la classe puisse avoir plusieurs recordsets d'ouverts en même temps.
> Savez-vous comment je devrais créer la classe pour que cela soit
> possible ?
>
> L'objectif de cette classe est que le code qui l'utilise n'ait jamais
> besoin de créer des objets recordsets.
>
> J'espère que mes explications sont claires.

Hello,

C'est un classique. Il y a plusieurs façons de faire. Le plus simple est de
créer non pas un (1) recordset dans ta classe mais un "pool" de recordsets.

Au niveau implémentation, c'est simplement un tableau de recordsets.
Pour les utilisateurs de ta classe, tu crées 2 méthodes publiques, l'une
permettant
d'"allouer" un recordset en lui donnant un nom logique, l'autre methodes
permettant
de "libérer" le recodset.

Tu dois aussi créer des fonctions permettant de manipuler chaque recordset
(mettre
du SQL, récupérer les résultats, etc.).

Je ne sais pas si je suis clair, sans doute pas trop :-(

Voici un moreceau de code, avec les méthodes pour créer (en fait juste
réserver
le nom), puis ouvrir:

Private Const MAX_RS As Long = 100

Private Type EasyRecordset
rs As ADODB.Recordset
logicalname As String
End Type

Private TRecordset(MAX_RS) As EasyRecordset

Public Function CreateRs(ByVal name As String) As Boolean
Dim i As Long

' trouve une place libre
For i = 1 To MAX_RS
If TRecordset(i).logicalname = "" Then
TRecordset(i).logicalname = name
CreateRs = True
Exit For
End If
Next i
End Function

Public Function OpenRs(ByVal name As String) As Boolean
Dim i As Long

For i = 1 To MAX_RS
If TRecordset(i).logicalname = name Then
Set TRecordset(i).rs = New ADODB.Recordset
TRecordset(i).rs.Open
found = True
OpenRs = True
Exit For
End If
Next i

End Function

Il ne te reste plus qu'à créer sur le même modèle
le CloseRs (qui fermera et resetera le logicalname pour faire de la
place)
le RSSetSql(), etc. en fonction de tes besoins.

C'est très simple à utiliser ensuite depuis l'extérieur, l'utilisateur ne
devant jouer qu'avec des noms logiques, sans savoir qu'il manipule
des recordset, des cursor et tout ça.

Bonne continuation!

Cordialement;


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;