Bonsoir à tous,
Je suis tellement satisfait de ma petite classe que j'ai décider de la publier et puis je vous est tellement ennuyé avec mes questions que c'est un juste rendu
C'est une classe qui n'a pas l'air comme ça mais qui rend un énorme service si vous avez besoin de manipuler des données issues d'une base de données.

Les Données peuvent être stockés dans un variable en 3 Versions :
- Original : Variable Nullable (Valeur original issue de la base, peut etre = Nothing)
- Current : Variable typé Non Nullable (Variable courante de travaille)
- Défaut : Variable typé Non Nullable (Valeur par Défaut optionnel si la base retourne DBNull).

Voici les principales caractéristiques et les fonctionnalités que je me suis imposées :
1- Permet de lire, stocker les valeurs DBNull pour éventuellement pouvoir les restituer ensuite dans la base. (Je commence par ce point qui me parait essentiel). Certains se demanderont pourquoi lire ou restituer une valeur DBNull, pour moi un bon code doit être prêt à toutes éventualités et écrire une valeur DBNull n'a rien de choquant et peut même être considéré comme n'importe quelle donnée, à fortiori si le code est prêt pour cela.
2- Le stockage d'une valeur DBNull dans une variable Nullable (qui prend dans ce cas la valeur Nothing) peut mettre la pagaille dans le code car cela oblige à tester fréquemment cette valeur pour savoir si elle est : (Is Nothing) ou (Is Not Nothing). En effet, sans ce test, les opérateurs "=" ou "<>" ne retournent pas les résultats attendues dés lors que l'on travaille avec des valeurs Nothing. La version Original (volontairement Nullable) est prévue pour stocker ce type de valeur mais elle n'est pas prévue pour travailler avec. Pour travailler et pouvoir utiliser les opérateurs correctement il faut utiliser la Version Current.
3- La classe permet de définir un valeur par défaut dans le cas ou la base retournerait une valeur DBNull (dans ce cas c'est cette valeur qui est utilisée dans la version Current)
4- Si vous me suivez toujours , la version Current ne peut pas être Nullable. Comment faire dans ce cas si on a besoin d'écrire une valeur DBNull dans la base sans déclarer une variable supplémentaire ? La Méthode SetRequestToDBNull est prévue pour cela.
5- Comment faire si à la place d'écrire une valeur DBNull on veut écrire la valeur par Défaut ? On utilise utilise l'argument WriteDefaut de la méthode Write value.
6- Ecrit dans la base uniquement si la valeur à écrire est différente de celle de la base. (Permet de ne pas modifier inutilement le Statut HasChanges du Dataset).

La code de la classe clsVarTypeDB :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Class clsVarTypeDB(Of T)
    Private O_Original As Object
    Private T_Defaut As T
    Private T_Current As T
    Private bol_RequestToDBNull As Boolean
    Public Sub New(ByVal Value As Object, Optional ByVal Defaut As T = Nothing)
        SetVersioningValues(Value, Defaut)
    End Sub
    Public ReadOnly Property Original() As Object
        Get
            Return O_Original
        End Get
    End Property
    Public ReadOnly Property Defaut() As T
        Get
            Return T_Defaut
        End Get
    End Property
    Public Property Current() As T
        Get
            Return T_Current
        End Get
        Set(value As T)
            T_Current = value
        End Set
    End Property
    Public ReadOnly Property IsRequestToDBNull() As Boolean
        Get
            Return bol_RequestToDBNull
        End Get
        'Set(value As Boolean)
        '    _SetNothing = value
        'End Set
    End Property
    Public Sub SetRequestToDBNull()
        bol_RequestToDBNull = True
    End Sub
    Public Sub ResetRequestToDBNull()
        bol_RequestToDBNull = False
    End Sub
    Public Sub SetVersioningValues(ByVal Value As Object, ByVal Defaut As T)
        T_Defaut = Defaut
        If Value Is DBNull.Value Then
            O_Original = Nothing
            T_Current = Defaut
        Else
            O_Original = Value
            T_Current = Value
        End If
    End Sub
    Public Sub WriteValue(ByVal Row As DataRow, ByVal ColName As String, Optional ByVal WriteDefaut As Boolean = False)
        Dim _Value As T
        If bol_RequestToDBNull = True Then
            If WriteDefaut = True Then
                _Value = T_Defaut
            Else
                Row(ColName) = DBNull.Value
                Exit Sub
            End If
        Else
            _Value = Current
        End If
 
        If O_Original Is Nothing Then
            Row(ColName) = _Value
        Else
            If O_Original <> _Value Then Row(ColName) = _Value
        End If
    End Sub
End Class
Pour l'utiliser (PS : Il faut disposer d'une Datarow que j'appelle : row) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
' Déclaration de la variable :
Dim MyVar1 As New clsVarTypeDB(Of Single)(Row(Colonne1),0.15)
' On peux manipuler MyVar1.Current
MyVar1.Current = 0.33
' On écrit la version current dans la base : 
MyVar1.WriteValue(Row, Colonne1)
 
' Pour ecrire une valeur DBNull :
MyVar1.SetRequestToDBNull()
MyVar1.WriteValue(Row, Colonne1)
 
' Pour écrire la valeur par défaut
MyVar1.SetRequestToDBNull()
MyVar1.WriteValue(Row, Colonne1, True)
Il y a surement d'autre façon de faire ou des améliorations à apporter mais cette classe me satisfait pleinement, j'espère qu'elle pourra vous rendre service également.
Vous pouvez apporter vos commentaires et vos critiques si vous le souhatez, le site est là pour ça