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 :

[VB.NET][MsSQL] alimenter un dataSet depuis un SqlDataReader


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut [VB.NET][MsSQL] alimenter un dataSet depuis un SqlDataReader
    Bonjour,

    Je cherche à récupéré les informations d'une requête.

    Je ne cherche pas d'élément graphique, juste une structure pour récupérer le résultat de la requête avant leur manipulation.

    Il semble que le Dataset remplirait cette fonction.

    Cependant je ne sais pas comment utiliser cette élément depuis un SqlDataReader.

    Voici le code que j'ai actuellement pour l'appel à ma Procédure Stockée :

    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
     
    Public Sub PS_Select_Employee_Production_Daily_Assignment_fct_periode()
            Dim DateDuJour As String
            Dim LundiDuJour As String
            Dim DateDuJourPlusNbSem As String
     
            If dateJ.Text <> "" Then
                DateDuJour = dateJ.Text
            Else
                DateDuJour = DateTime.Now.Date
            End If
     
            LundiDuJour = lundiSemDateJour(DateDuJour)
            DateDuJourPlusNbSem = DatePlusNbSem(LundiDuJour, nbSemaine)
     
            maCmd = maCnx.CreateCommand
            maCmd.CommandType = CommandType.StoredProcedure
            maCmd.CommandText = "PS_Select_Employee_Production_Daily_Assignment_fct_periode"
     
            maCmd.Parameters.Add(New SqlParameter("@date_debut", SqlDbType.DateTime))
            maCmd.Parameters.Add(New SqlParameter("@date_fin", SqlDbType.DateTime))
     
            maCmd.Parameters("@date_debut").Value = LundiDuJour
            maCmd.Parameters("@date_fin").Value = DateDuJourPlusNbSem
     
            maCmd.ExecuteNonQuery()
     
            Try
                Dim curseur As SqlDataReader = maCmd.ExecuteReader
                Dim DataS As DataSet()
     
                curseur.Close()
            Catch ex As Exception
     
            End Try
     
     
        End Sub
    Je continue met recherche.

    Si quelqu'un à une idée je suis preneur.

    ++

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    il faut bien connaitre les différents objets de base de données pour savoir lequel te convient le mieux

    le datareader sert à extraire des données, pas de stockage
    le datatable sert à stocker des données
    le dataset sert à stocker des données et les remettre dans la base après modification sans avoir grand chose à coder
    le dataadapter sert à remplir un datatable ou un dataset via l'instruction Fill et à faire les requetes pour répercuter les modifs sur la base (pour le dataset je pense)

    tu peux aussi stocker tes valeurs dans des collections de type objet correspondant à ta table en base
    c'est en théorie le plus performant, datatable et dataset ne sont pas très performant

    sinon tu peux aussi regarder linq to sql ou entity framework
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    Bonjour,

    J'ai essayer en utilisant un tableau d'une structdef :
    Définition de ma structdef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public Structure DataEmployeeDailyAssignment
            Dim AssignDate As Date
            Dim contracted_Time As Double
            Dim Schedule_Desc As String
            Dim Schedule_Abbr As String
            Dim D_Schedule_Abbr As String
            'concaténation nom prénom de l'utilisateur
            Dim Ressource As String
            Dim Maitrise As String
            Dim Secteur As String
            Dim Matricule As String
            Dim Contrat As String
    End Structure
    Définition de mon tableau de structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public tabInfoEmployee() As DataEmployeeDailyAssignment = New DataEmployeeDailyAssignment() {}
    et remplissage de ma structure

    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
    Public Sub PS_Select_Employee_Production_Daily_Assignment_fct_periode()
            Dim DateDuJour As String
            Dim LundiDuJour As String
            Dim DateDuJourPlusNbSem As String
     
            If dateJ.Text <> "" Then
                DateDuJour = dateJ.Text
            Else
                DateDuJour = DateTime.Now.Date
            End If
     
            LundiDuJour = lundiSemDateJour(DateDuJour)
            DateDuJourPlusNbSem = DatePlusNbSem(LundiDuJour, nbSemaine)
     
            maCmd = maCnx.CreateCommand
            maCmd.CommandType = CommandType.StoredProcedure
            maCmd.CommandText = "PS_Select_Employee_Production_Daily_Assignment_fct_periode"
     
            maCmd.Parameters.Add(New SqlParameter("@date_debut", SqlDbType.DateTime))
            maCmd.Parameters.Add(New SqlParameter("@date_fin", SqlDbType.DateTime))
     
            maCmd.Parameters("@date_debut").Value = LundiDuJour
            maCmd.Parameters("@date_fin").Value = DateDuJourPlusNbSem
     
            maCmd.ExecuteNonQuery()
     
            Try
                Dim curseur As SqlDataReader = maCmd.ExecuteReader
     
                While (curseur.Read())
                    ReDim Preserve tabInfoEmployee(UBound(tabInfoEmployee) + 1)
                    tabInfoEmployee(UBound(tabInfoEmployee)).AssignDate = curseur.GetDateTime(0)
                    tabInfoEmployee(UBound(tabInfoEmployee)).contracted_Time = curseur.GetDouble(1)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Contrat = curseur.GetString(2)
                    tabInfoEmployee(UBound(tabInfoEmployee)).D_Schedule_Abbr = curseur.GetString(3)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Maitrise = curseur.GetString(4)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Matricule = curseur.GetString(5)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Ressource = curseur.GetString(6) + curseur.GetString(7)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Schedule_Abbr = curseur.GetString(8)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Schedule_Desc = curseur.GetString(9)
                    tabInfoEmployee(UBound(tabInfoEmployee)).Secteur = curseur.GetString(10)
                End While
                curseur.Close()
            Catch ex As Exception
                MsgBox("erreur retournée : " & ex.ToString)
            End Try
     
     
        End Sub
    Cependant ca semble coincer, à savoir que la requete me renvoie 27902 lignes de réponse.

    Je voulais savoir si le datatable serai capable de pallier ce problème.

    Le DataSet ne me sera pas utile car je n'ai pas besoin d'insérer d'information dans la base, j'ai juste à en stocké pour de l'affichage ou du calcule.

    Cependant que ca soit un datatable ou un dataSet je ne sais pas comment récupérer les lignes de réponse de la requête. Est-ce toujours avec un sqlReader?
    [edit : je viens de relire ta réponse concernant le dataadapter]

    Sinon je pense que je vais devoir diviser mes requêtes pour récuperer les infos en plusieurs fois.

    Faut que je trouve déjà comment alimenter le datatable à partir d'un résultat de requete.

    Je continue mes recherches.

  4. #4
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 21
    Par défaut alimenter un dataset depuis un sqldatareader
    pour manipuler le resulat d'un datareader
    tu boucle sur les éléments de reader et tu les stocke c'est tout sans passer par un dataset

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    bonjour,

    Je viens de refaire un test avec ma méthode :

    Donc j'obtiens ce message d'erreur :

    Le CLR n'a pas pu effectuer de transition du contexte COM 0x10626e0 au contexte COM 0x1062850 pendant 60 secondes. Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire. Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles) et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.
    Cependant j'avais pas fait gaffe mais il y a un bouton continuer dans la fenetre de ce message d'erreur, j'ai donc cliqué dessus et il semble finaliser la récupération des lignes de résultats de ma requête.

    Je me pose quand même une question concernant l'appli finale comment cela pas apparaitre à l'utilisateur, plantage de l'appli?

    pour manipuler le resulat d'un datareader
    tu boucle sur les éléments de reader et tu les stocke c'est tout sans passer par un dataset
    Récupérer les données ne me pose pas de soucis. Le soucis vient cependant de la quantité de donner à récupérer. Et c cette grande quantité de donnée qui me pose problème . (cf mon code)

    Bon sinon je continue a regarder pour les datatable et voir comment les utiliser.

    ++

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    je te conseille de lire un tuto comme celui ci
    http://plasserre.developpez.com/cours/vb-net/

    les tableaux c'est pas conseillé, c'est pas lisible et des redim preserve c'est pas performant


    tu peux faire ton traitement dans un thread séparé pour pas que le temps de lire les données ne bloque l'interface utilisateur (voir thread ou backgroundworker)
    à savoir que le datatable sera plus long qu'une collection de classe (et non un tableau de structure ^^)

    enfin dnas le tuto y a tout ca je pense ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    Bonjour,

    Je viens de relire pour la nième fois le cours de plasserre.

    Cependant je n'ai pas trouver d'élément concernant l'utilisation d'un DataAdapter avec l'utilisation des procédure stockée. Il y a bien un exemple, mais il s'agit d'un exemple avec un command string :

    XVII-E-2. Utilisation du DataSet, du DataView : en pratique

    Les extraits (snippets) de VB 2005, donne un exemple de code plus condensé pour ouvrir un DataSet:

    Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0; _
    Data Source=AccessFile.mdb;Persist Security Info=False"

    Dim cmd As String = "Select * from Topics"

    Dim adapter As New OleDbDataAdapter(cmd, conn)

    Dim topics As New Data.DataSet

    adapter.Fill(topics)

    Concernant les thread je pense que je vais être obligé de les utilisé pour ces traitement long.

    une collection de classe (et non un tableau de structure ^^)
    euh la je n'ai pas bien compris . J'utilise pourtant un tableau d'un type structuré.

    J'avais essayé avec les collections mais je ne vois pas comment lui faire géré des ensembles d'élément de type différent.

    voila voila

    ++

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    au lieu de public structure, public class c'est en général mieux (attention toute fois ca ne fonctionne pas pareil il faut ensuite un new pour avoir une instance)
    et au lieu de public tab() as machin faire public mesmachins as new system.collections.generic.list(of machin)
    ensuite du peux faire .add au lieu d'un redim preserve et tab(i)
    tu peux accéder à un element comme avec un tableau mesmachins(numero)
    et les collections je pense qu'ils en parlent dans le tuto


    pour ce qui est des procédures stockées, si tu veux récupérer des données il faut que celle ci se termine par un select et après ca fonctionne comme une requete select dans vb
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [Win32] Retourner un dataset depuis un Web Service
    Par romstarr dans le forum Web & réseau
    Réponses: 2
    Dernier message: 10/05/2008, 17h47
  2. Réponses: 1
    Dernier message: 18/02/2007, 20h28
  3. [VB.NET] Requete dans un DataSet
    Par leSeb dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/10/2005, 13h58
  4. [VB.NET] [ADO.NET] Adapter, TableMapping et DataSet xsd
    Par neo.51 dans le forum Accès aux données
    Réponses: 14
    Dernier message: 23/09/2004, 16h52
  5. [VB.NET] Alimenter un dataset avec une chaine XML...
    Par David.V dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/05/2004, 09h09

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