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

Accès aux données Discussion :

[VB.Net] Comment convertir SqlDataReader.GetValues en tableau de string ?


Sujet :

Accès aux données

  1. #1
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut [VB.Net] Comment convertir SqlDataReader.GetValues en tableau de string ?
    Bonjour

    Je récupère des enregistrements stockés dans un serveur SQL à l'aide d'un DataReader. Je dois ensuite écrire les résultats dans un fichier au format csv.

    Pour éviter de faire une boucle qui écrit chaque colonne dans le fichier en insérant des virgules, j'aimerais utiliser la méthode Join de la classe String.

    J'ai donc fait ca :


    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
    Dim myConn As New SqlConnection(My.Settings.ConnectionString)
    myConn.Open()
     
    Dim result As Integer
    Dim values(246) As Object
    Dim myCommande As New SqlCommand("Select * From ...", myConn)
    Dim myReader As SqlDataReader
    myReader = myCommande.ExecuteReader
     
    While myReader.Read
         result = myReader.GetValues(values)
         strToWrite = String.Join(",", values)
         .... 'Ecriture de strTowrite dans fichier
    End While
    ...
    Bien entendu ca plante au niveau du String.Join, mon tableau étant un tableau d'object et String.Join attend un tableau de String.

    Comment faire ? Y a t'il un moyen de convertir le tableau renvoyé par le dataReader en tableau de String ?

    Lien sur la méthode SqlDataReader.Getvalues : http://msdn2.microsoft.com/fr-fr/lib...getvalues.aspx

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Je ne pense pas que ton souci soit spécifique d'ADO.Net
    Nous verrons peut-être à deplacer ton sujet plus tard à la place idoine
    Bon peux-tu essayer dans un premier temps ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        '...
        While myReader.Read
           result = myReader.GetValues(values)
           strToWrite = ConvertToString(values)
           'écriture de strToWrite dans fichier
        End While
        '...
     
    Private Function ConvertToString(ByVal objets As Object()) As String
       Dim strCopy(objets.Length-1) As String
       Array.Copy(objets,strCopy,objets.Length)
       Return String.Join(",", strCopy)
    End Function
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    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
    ....        
    Dim result As Integer
    Dim strTowrite As String
    Dim values(246) As Object
     
            While myReader.Read
                result = myReader.GetValues(values)
                strToWrite = ConvertToString(values)
            End While
    ...
        Private Function ConvertToString(ByVal objets As Object()) As String
            Dim strCopy(objets.Length - 1) As String
            Array.Copy(objets, strCopy, objets.Length - 1)
            Return String.Join(",", strCopy)
        End Function
    J'obtiens l'exeption suivante lors de l'execution du Array.copy :

    Impossible d'effectuer au moins un cast d'élément du tableau source dans le type tableau de destination.

    Avec ma requete de test, je récupère un tableau dans lequel il y a un objet DateTime, tous les autres élements sont des objets Integer.

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Angath
    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
    ....        
    Dim result As Integer
    Dim strTowrite As String
    Dim values(246) As Object
     
            While myReader.Read
                result = myReader.GetValues(values)
                strToWrite = ConvertToString(values)
            End While
    ...
        Private Function ConvertToString(ByVal objets As Object()) As String
            Dim strCopy(objets.Length - 1) As String
            Array.Copy(objets, strCopy, objets.Length - 1)
            Return String.Join(",", strCopy)
        End Function
    J'obtiens l'exeption suivante lors de l'execution du Array.copy :

    Impossible d'effectuer au moins un cast d'élément du tableau source dans le type tableau de destination.

    Avec ma requete de test, je récupère un tableau dans lequel il y a un objet DateTime, tous les autres élements sont des objets Integer.
    Arf dommage bon Array.Copy ne fonctionne effectivement que sur des cast automatiques evidents; tant pis il te faudra donc tout de même itérer avec un For Each dans la méthode exemple ConvertToString
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        Private Function ConvertToString(ByVal objets As Object()) As String
            Dim strCopy(objets.Length - 1) As String
            Dim o As Object
            Dim i As Integer = 0
            For Each o In objets
                strCopy.SetValue(o.ToString(),i)
                i += 1
            Next
            Return String.Join(",", strCopy)
        End Function
    Si tu veux un format d'affichage particulier pour la date, il te faudra ajouter une conditionnelle au sein du For Each pour un objet de type DateTime
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    Ca marche bien

    Dommage que le array.copy ne sache pas faire.
    C'est déjà beaucoup plus rapide, que ma boucle qui parcoure toute les colonnes et rajoute les virgules une à une.

    Merçi Neguib

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/11/2006, 17h47
  2. [VB.Net] Comment convertir un string en double ?
    Par Aspic dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2006, 19h04
  3. Réponses: 9
    Dernier message: 13/02/2006, 08h39
  4. Réponses: 4
    Dernier message: 25/10/2005, 14h06

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