Probleme insertion data grid view et sql

t4gad4 Messages postés 58 Date d'inscription dimanche 19 septembre 2010 Statut Membre Dernière intervention 26 juillet 2013 - 27 avril 2012 à 23:21
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 30 avril 2012 à 10:15
Bonjour a tous!!! voila mon probleme j'ai une base de donnee access et mon appli je dois faire un formulaire de recherche et recuperer les données de la base et afficher une liste de ces données dans un datagridview... le probleme c'est que mon code me dis qu'il y a une erreur , il me dis que j'ai cette exception:

Une ArgumentOutOfRangeException est levée lorsqu'une méthode est appelée et qu'au moins un des arguments passés à la méthode n'est pas une référence null ( Nothing en Visual Basic) et ne contient pas de valeur valide.


voici mon code! et je travail sur visual studio 2010 :

Dim MaConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0; Data source=BDD projet.accdb")

        Dim MaCommande As OleDbCommand = MaConnexion.CreateCommand()
        Dim MaCommande1 As OleDbCommand = MaConnexion.CreateCommand()
        

        If RadioButton1.Checked Then
            MaConnexion.Open()
            Dim nombreid As Integer
            MaCommande1.CommandText = "SELECT count(*) FROM PATIENT WHERE ID='" & TextBox1.Text & "';"
            Dim monreader1 As OleDbDataReader = MaCommande1.ExecuteReader()
            monreader1.Read()
            nombreid = monreader1.GetInt32(0)
            MaCommande.CommandText = "SELECT NomPat,PrePat,MedecinTraitant,Pathologie FROM PATIENT WHERE ID='" & TextBox1.Text & "';"
            Dim monreader As OleDbDataReader = MaCommande.ExecuteReader()
            monreader.Read()
            While (monreader.Read = True)
                For i = 0 To nombreid Step 1
                    DataGridView1.Item(0, i).Value = TextBox1.Text
                    DataGridView1.Item(1, i).Value = monreader.GetString(0)
                    DataGridView1.Item(2, i).Value = monreader.GetString(1)
                    DataGridView1.Item(3, i).Value = monreader.GetString(2)
                    DataGridView1.Item(4, i).Value = monreader.GetString(3)
                Next
            End While

            MaConnexion.Close()


Merci d'avance!!!

10 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
28 avril 2012 à 00:32
Bonjour,

A la place de 2 requêtes, regardes la fonction Read des Datareader.

Lis aussi ce sujet qui est directement en lien avec ton pb, je pense :
http://www.vbfrance.com/forum/sujet-REQUETE-SQL-VBA_1588073.aspx

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
t4gad4 Messages postés 58 Date d'inscription dimanche 19 septembre 2010 Statut Membre Dernière intervention 26 juillet 2013 1
28 avril 2012 à 00:43
bonsoir a toi je te remercie pour ta reponse malheureusement je comprend rien au read et le lien que tu m'as donne c'est un de mes sujets et je l'ai utiliser pour faire mon code ci dessus tu remarquera d'ailleur la boucle et pourtant tjr la meme erreure.... pas moyen j'ai essaye plein de trucs differents mais rien ne marche...
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
28 avril 2012 à 00:53
Bonjour,

As-tu lu l'aide concernant le Read ?
http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdatareader.read.aspx

"Advances the OleDbDataReader to the next record."

Une seule utilisation de Read est suffisante pas besoin d'en faire 50.

Bien que pour un DGV, un Dataset serait plus adapté.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
t4gad4 Messages postés 58 Date d'inscription dimanche 19 septembre 2010 Statut Membre Dernière intervention 26 juillet 2013 1
28 avril 2012 à 09:49
bonjour,

oui j'ai bien lu l'aide fourni par msdn seulement les reads je les utilise deja... :

Dim monreader As OleDbDataReader = MaCommande.ExecuteReader()
            monreader.Read()


pourquoi il me marque une erreure au niveau du numero de la ligne du DGV , j'ai fais plusieurs test et quand je met datagridview1.items(x,y).value=...

le probleme viens du y quand il est dans une boucle et si on le met pas dans une boucle ca marche ya pas d'erreure...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
t4gad4 Messages postés 58 Date d'inscription dimanche 19 septembre 2010 Statut Membre Dernière intervention 26 juillet 2013 1
28 avril 2012 à 09:53
ha et une derniere petite question, j'ai un form d'identification pour se connecter et je voudrais declarer une variable dans l'identification pour y mettre l'identifiant de l'utilisateur qui se connecte et pouvoir utiliser cette variable et son contenu dans d'autres forms est ce que c'est possible si oui comment...?
0
t4gad4 Messages postés 58 Date d'inscription dimanche 19 septembre 2010 Statut Membre Dernière intervention 26 juillet 2013 1
29 avril 2012 à 23:53
up
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
29 avril 2012 à 23:58
Bonjour,

Pour l'identification : http://www.vbfrance.com/forum/sujet-VARIABLE-GENERALE_1588279.aspx

Pour le DGV, regardes du coté du Dataset/DataTable, le DGV se remplira automatiquement.
"il me marque une erreure au niveau du numero de la ligne du DGV"
Quel message ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
tri_yann Messages postés 124 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 19 septembre 2013 3
30 avril 2012 à 00:45
Bonjour, Essaie "Nombreid -1" dans ta boucle

            While (monreader.Read = True)
                For i = 0 To nombreid -1 Step 1
                    DataGridView1.Item(0, i).Value = TextBox1.Text
                    DataGridView1.Item(1, i).Value = monreader.GetString(0)
                    DataGridView1.Item(2, i).Value = monreader.GetString(1)
                    DataGridView1.Item(3, i).Value = monreader.GetString(2)
                    DataGridView1.Item(4, i).Value = monreader.GetString(3)
                Next
            End While


Yann
0
tri_yann Messages postés 124 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 19 septembre 2013 3
30 avril 2012 à 01:08
En fait, c'est ta méthode de remplissage qui n'est pas bonne. Essaie :
MaConnexion.Open()
MaCommande.CommandText = "SELECT NomPat,PrePat,MedecinTraitant,Pathologie FROM PATIENT WHERE ID='" & TextBox1.Text & "';"
            Dim monreader As OleDbDataReader = MaCommande.ExecuteReader()
            Dim i As Integer
            While (monreader.Read = True)
                i = DataGridView1.Rows.Add()
                DataGridView1.Item(0, i).Value = TextBox1.Text
                DataGridView1.Item(1, i).Value = monreader.GetString(0)
                DataGridView1.Item(2, i).Value = monreader.GetString(1)
                DataGridView1.Item(3, i).Value = monreader.GetString(2)
                DataGridView1.Item(4, i).Value = monreader.GetString(3)
            End While

Je pars de l'hypothèse que ton nombre de colonne est bon. La première requête de comptage n'est pas nécessaire. A moins qu'il y a ait une subtilité qui m'ait échappée.

Yann
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
30 avril 2012 à 10:15
Salut

il serait mieux de grouper les fonctions SQL
à part dans un module et des requetes parametrées

ex selon ton code

Imports System.Data.OleDb
Module db
    Private Connection As New  OleDb.OleDbConnection 'declares  connection

Public Sub Init()
   Dim base As String = ("Provider=Microsoft.ACE.OleDb.12.0; Data source=BDD projet.accdb")
        Connection.ConnectionString = base
        Try
            Connection.Open()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Public Sub CloseConnection()
        Connection.Close()
    End Sub
Private Function GetRecords(ByVal IdPatient As String) As Integer
        Dim sql As String = String.Empty
        Dim command As New OleDbCommand(sql, Connection)
        Dim recordset As OleDbDataReader
        recordset = Nothing
        command.CommandText "SELECT COUNT(*) FROM PATIENT WHERE ID [?] ;"
        command.Parameters.Add("?", OleDbType.BSTR).Value = IdPatient
        Try
            recordset = command.ExecuteReader
            If recordset.HasRows Then
                recordset.Read()
                Return recordset.GetInt32(0)
            Else
                Return 0
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Function

Public Function GetDetailsPatient(ByVal IdPatient As String) As OleDbDataReader
        Dim sql As String = String.Empty
        Dim command As New OleDbCommand(sql, Connection)
        Dim recordset As OleDbDataReader
        recordset = Nothing
        command.CommandText = "SELECT NomPat,PrePat,MedecinTraitant,Pathologie FROM PATIENT WHERE ID= [?] ;"
        command.Parameters.Add("?", OleDbType.BSTR).Value = IdPatient
        Try
            recordset = command.ExecuteReader
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Return recordset

    End Function
End Module


dans ta form

Imports System.Data.OleDb
Public Class Form1

 Private Sub ShowResultPatientPathology()
        Dim recordset As OleDbDataReader
        Dim iter As Integer
        Dim titles(3) As String
        Dim margin As Integer
        Dim widthgrid As Integer
        Dim heightgrid As Integer
        Dim drawfont As New Font("arial", 14, FontStyle.Bold, GraphicsUnit.Pixel)

        titles(0) = " Nom Patient"
        titles(1) = "Prenom Patient"
        titles(2) = " Medecin Traitant"
        titles(3) = "Pathologie"
        DataGridresult.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Sunken
        DataGridresult.Font = drawfont
        recordset = Nothing
        recordset = db.GetListPatientPathology(textbox1.text)
        If Not recordset.HasRows Then
            MessageBox.Show("Aucun résultat")
            Exit Sub
        End If
        DataGridresult.AutoResizeColumns()
        DataGridresult.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
        DataGridresult.EnableHeadersVisualStyles = False
        DataGridresult.ColumnHeadersDefaultCellStyle.BackColor = Color.PowderBlue
        DataGridresult.Columns.Clear()
        DataGridresult.Rows.Clear()
        For iter = 0 To recordset.VisibleFieldCount - 1
            DataGridresult.Columns.Add(recordset.GetName(iter), titles(iter))
            DataGridresult.Columns(iter).DefaultCellStyle.BackColor = Color.Linen
        Next
        Dim rowvalue(recordset.VisibleFieldCount - 1) As String
        Dim counter As Integer
        counter = 1
        While recordset.Read
            If counter > 14 Then
                heightgrid = DataGridresult.RowHeadersWidth * 12
            Else
                heightgrid = DataGridresult.RowHeadersWidth * counter
            End If
            counter += 1
            widthgrid = 40
            For iter = 0 To recordset.VisibleFieldCount - 1
                DataGridresult.Columns(iter).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
                rowvalue(iter) = (Convert.ToString(recordset.GetValue(iter)))
                widthgrid += DataGridresult.Columns(iter).Width
            Next
            DataGridresult.Rows.Add(rowvalue)
        End While

        DataGridresult.Width = widthgrid
        DataGridresult.Height = heightgrid
    End Sub

  Private Sub Buttonvalid_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Buttonvalid.MouseClick
   If RadioButton1.Checked Then
     db.Init()
     ShowResultPatientPathology
     db.CloseConnection
  End Sub

End Class



J'ai l'impression que ta Bdd est pas bien faite
le id du patient son nom et prenom sont dans le
meme tableau
il serait mieux de mettre le nom prenom adresse
etc du patient dans un tableau à part avec comme primary key le id du patient qui est unique
0
Rejoignez-nous