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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Conversion de données qu'il me force à faire [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Décembre 2022
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Décembre 2022
    Messages : 76
    Points : 56
    Points
    56
    Par défaut Conversion de données qu'il me force à faire
    Bonjour,

    J'ai un problème dans mon application au niveau de conversion de données qu'il me force à faire.

    J'ai créé par code des DataTables avec des colonnes de type soit String, soit UInt16 (UShort). Je les remplis avec une base de données. Tout va bien jusque là.

    J'ai ensuite une fonction qui extrait des données des DataTables (méthode select...) :

    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
    Public Function ExtractDonneesDataTable(ByVal Dtt As DataTable, ByVal NumChampFiltre As Byte, ByVal ExpressionFiltre As UShort, ByVal NumChampTri As Byte, ByVal ExpressionTri As String) As DataRow()
     
            With Dtt
     
                'Renvoie le résultat en fonction des situations avec un filtre de type UShort
                If NumChampFiltre = 0 And ExpressionFiltre = 0 Then
                    If NumChampTri = 0 And ExpressionTri = "" Then
                        Return .Select()
                    Else
                        Return .Select("", .Columns(NumChampTri).ColumnName & " " & ExpressionTri)
                    End If
                Else
                    If NumChampTri = 0 And ExpressionTri = "" Then
                        Return .Select(.Columns(NumChampFiltre).ColumnName & " = " & CStr(ExpressionFiltre), "")
                    Else
                        Return .Select(.Columns(NumChampFiltre).ColumnName & " = " & CStr(ExpressionFiltre), .Columns(NumChampTri).ColumnName & " " & ExpressionTri)
                    End If
                End If
     
            End With
     
        End Function
    Ca fonctionne très bien jusque là.

    Ensuite dans un autre Form, je crée un DataRow() pour récupérer le résultat d'une extraction bien précise à partir d'une des DataTables (DttBibliotheque).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim DtRow As DataRow() = FormPrincipal.ExtractDonneesDataTable(FormPrincipal.DttBibliotheque, 11, FormPrincipal.NumImageEnCours, 0, "")
    Ca se passe bien aussi.

    J'affiche ensuite dans un label du Form le résultat d'une nouvelle extraction d'une autre DataTable (DttAnnee) en fonction de la valeur renvoyée par mon ancienne extraction (DtRow(0)(3)). Les deux DataTables sont en lien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label2.Text = FormPrincipal.ExtractDonneesDataTable(FormPrincipal.DttAnnee, 0, CUShort(DtRow(0)(3)), 0, "")(0)(1).ToString
    Le problème, c'est que je suis obligé dans ce bout de code de laisser la conversion CUShort() autour de DtRow(0)(3) alors qu'il est bien de type UInt16.
    Si je l'enlève, il me met "obligation de conversion stricte..."

    Je ne comprends pas. Sauf si UInt16 ne corresponde pas à un UShort, et ça pourrait expliquer le problème....

    Merci pour vos aides.

  2. #2
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Je peux te confirmer que UShort est bien une appellation synonyme de UInt16.

    Pour le reste ...

    Thumb down te proposait d'utiliser le DirectCast. Peut-être devrais-tu abandonner ces outils spécifiques issus de la librairie "Visual Basic".
    Personnellement, j'utilise CType https://learn.microsoft.com/fr-fr/do...ctype-function :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'UneValeurDuTypeDemande = CType(UneValeurDeTypeQuelconque, TypeDemande)
     
    UneValeurUShort = CType(DtRow(0)(3), UInt32)  ' A condition que DtRow(0)(3) soit effectivement convertible en numérique

  3. #3
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Décembre 2022
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Décembre 2022
    Messages : 76
    Points : 56
    Points
    56
    Par défaut
    En fait, pour créer les colonnes de ma DataTable, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With DttGenre.Columns
                .Add("N°", Type.GetType("System.UInt16"))
                .Add("Genre", Type.GetType("System.String"))
            End With
    Par exemple.

    Donc logiquement, mes données dans la colonne 0 devraient être du UInt16...
    Et il veut que je force la conversion... alors que c'est déjà en UInt16...
    Je ne comprends pas...

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    OK pour la création des colonnes mais ton exemple que j'ai repris en partie porte sur la colonne d'indice 3 (la 4ème colonne) : est-elle bien de type numérique ?

    Suggestion :
    Sais-tu que tu as le choix en Access entre Octet, Entier, Entier Long, ..., pour préciser les types numériques.
    Si tu modifiais en Octet le type de numérique des colonnes que tu veux en UInt16, tu pourrais laisser la méthode Fill créer seule tes tables avec les bons types aux bons endroits.

    Nom : NumAccess.jpg
Affichages : 94
Taille : 45,3 Ko

    Après vérification, si un champ numérique d'Access est un NumeriqueAuto, celui-là est seulement un entier long.
    Mais ceci ne concerne raisonnablement que les Id.

    ..

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Quelque soit le type que tu as donné à ta colonne, DataRow.Item() renvoie une variable de type Object. Ta valeur est bien de type UInt16 qui est un type dérivé du type Object.

    Donc tu récupère un UInt16 mais sous le type générique Object, qu'il te faut (re)caster en UInt16.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Décembre 2022
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Décembre 2022
    Messages : 76
    Points : 56
    Points
    56
    Par défaut
    Merci à vous deux !

    J'adore comprendre et pour le coup, je comprends bien avec vos explications.
    J'ai fait un tour sur CType et DirectCast, les différences, les performances, la rapidité de chacun des opérateurs. Mieux documenté en anglais pour le coup.

    J'ai appris des tas de choses.

    Pour access, j'a pas dû faire attention sur cette possibilité de fixer des UInt16. Je vais regarder cela de près.
    Dans ma DataTable, la collonne (3) est bien en UInt16.
    Mais comme explique sevyc64, DataRow().Item() renvoie un type Objet, donc ça explique que je dois recaster en UInt16.

    Merci à vous.

  7. #7
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DtRow(0)(3).Cast(of UInt16)
    'je pense que la propriété value doit être du UInt16
    DtRow(0)(3).value 'a vérifier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion de données
    Par noratec dans le forum Access
    Réponses: 3
    Dernier message: 17/03/2006, 17h50
  2. Conversion de données
    Par charliejo dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/01/2006, 09h59
  3. Récuperer les données d'un FlexGrid pour faire requete SQL
    Par Terminator dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/10/2005, 11h26
  4. Pb de conversion de données 16 vers 32
    Par Ducmonster dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2005, 11h53
  5. [JSTL] [SQL] Conversion de données
    Par GiHe dans le forum Taglibs
    Réponses: 4
    Dernier message: 27/09/2005, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo