Probleme base access avec vb.net

Probleme base access avec vb.net - VB/VBA/VBS - Programmation

Marsh Posté le 16-07-2005 à 16:54:23    

Bonjour,
je galere un peu. J'ai suivi la doc du lien :
http://plasserre.developpez.com/v6-2.htm
sur un formulaire j'ai inséré un datagrid et un bouton, j'arrive a recupérer les infos de ma base access sur le datagrid mais pas a modifier ma base access avec les infos du datagrid....
Si quelqu'un peut m'aider, car vb.net commence a m'énerver un peu!;-)
 
 
Public Class test
 
    'declaration des variables
 
    Dim memoire As New DataSet() 'creation du dataset
    Dim NewLigne As DataRow
    Dim cnx As OleDbConnection
    Dim base As String
    Dim liaison As New OleDbDataAdapter
 
    Sub chargement()
        Try
         
            Dim BdProvider = "Microsoft.Jet.Oledb.4.0"
            Dim BdPathDirectory = "C:\Documents and Settings\test.mdb"
 
            base = "provider=" & BdProvider & "; " & _
             "data source= " & BdPathDirectory
 
            'declaration de la connection
            cnx = New OleDbConnection(base)
            cnx.Open() 'ouverture de la connection
 
            'Dim requete = "SELECT Couple.[Nom couple], Couple.Abscisse FROM Couple"
            Dim requete = "SELECT Couple.* FROM Couple"
            liaison = New OleDbDataAdapter(requete, base)
 
            'charge la table en mémoire
            liaison.Fill(memoire, "Couple" )
 
            Dim vue As New DataView(memoire.Tables("Couple" ))
            DataGridView1.DataSource = vue
 
            cnx.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message, Me.Text)
        End Try
 
    End Sub
 
 
    Private Sub test_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        chargement()
 
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            cnx.Open()
            NewLigne = memoire.Tables("Couple" ).NewRow
            NewLigne(0) = "tata"
            NewLigne(1) = "toto"
 
            ' Création de la nouvelle ligne  
            memoire.Tables("Couple" ).Rows.Add(NewLigne) 'ca creer bien la nouvelle ligne ds le datagrid...apres ca ne mache pas!
 
 
            Dim CmdBuild As OleDbCommandBuilder
            CmdBuild = New OleDb.OleDbCommandBuilder(liaison)
 
            ' liaison = New OleDbDataAdapter("SELECT Couple.[Nom couple], Couple.Abscisse FROM Couple", base)
            liaison = New OleDbDataAdapter("SELECT Couple.* FROM Couple", base)
 
            liaison.InsertCommand = CmdBuild.GetInsertCommand()
            liaison.Update(memoire, "Couple" )
            cnx.Close()
 
 
 
            chargement()
            'DataGridView1.Refresh()
        Catch ex As Exception
            MessageBox.Show(ex.Message, Me.Text)
        End Try
    End Sub
End Class

Reply

Marsh Posté le 16-07-2005 à 16:54:23   

Reply

Marsh Posté le 19-07-2005 à 11:33:20    

Citation :

     
      Dim vue As New DataView(memoire.Tables("Couple" ))  
      DataGridView1.DataSource = vue  


 
Bonjour je suis trés loin d'être un spécialiste du Datagrid mais il y a un truc qui m'interpèle dans ton code
c'est que tu utilises un DataView
Un DataView sert seulement à visualiser des infos et non à les modifier.
Essaie de voir en utilisant un dataset
 
Bon courage !

Reply

Marsh Posté le 19-07-2005 à 11:35:51    

Non. Le DataView modifie le truc associé. D'ailleurs le DataGrid crée automatiquement un DataView si on lui file un DataTable par exemple. Le problème dans notre cas, c'est qu'il n'y a ni requête de mise à jour, ni requête de suppression, c'est logique.

Reply

Marsh Posté le 19-07-2005 à 14:52:44    

Encore moi ! :hello:  
 
Tiens joe361 puisque tu connais déjà le site regarde quelques pages plus loin  
 
http://plasserre.developpez.com/v6-5.htm
 
et regarde la rubrique Ouverture et Modifier un enregistrement.
 
Toujours sur la base de leur exemple aprés le code ouverture rajoute cela :  
 

Code :
  1. DataGrid1.SetDataBinding(ObjetDataSet, "FICHEPATIENT" )


 
Le code de la rubrique "Modifier un enregistrement" tu peux le mettre dans un bouton que tu peux intituler "Enregister".
 
Et il marche autant pour les ajouts, supression, etc.
 
J'espère que ça t'aidera !
 
 
 


Message édité par ricil78 le 19-07-2005 à 14:56:28
Reply

Marsh Posté le 19-07-2005 à 19:12:37    

Apres le dernier post, j'ai ete pris d'une grande joie...mais rien ne ce passe quand je mets le code suivant dans le boution OK:
cnx.Open()
 
            DataGrid1.SetDataBinding(memoire, "Couple" )
            cnx.Close()  
Pourquoi? Suis je condanné a utiliser des requetes sql!

Reply

Marsh Posté le 19-07-2005 à 19:17:17    

Vu que tu as du modifier ton code peux tu le remettre en entier STP
 
et verrai si je peux faire quelque chose pour toi  :)

Reply

Marsh Posté le 19-07-2005 à 19:18:50    

ps: je n'ai bien sûr pas utiliser les codes de mon premier post a savoir :
liaison.InsertCommand = CmdBuild.GetInsertCommand()
je charge mon formulaire : avec la methode suivante :
Private Sub taffichageDBCouple(ByVal requete As String, ByVal table As String, ByVal DataGridViewName As DataGrid)
        Try
            'On parametre la chaine de connection pour la base de donnée  
            base = "provider=" & BdProvider & "; " & _
             "data source= " & BdPathDirectory
 
            'declaration de la connection
            cnx = New OleDbConnection(base)
            cnx.Open() 'ouverture de la connection
 
            'lien entre la base et la requète
            liaison = New OleDbDataAdapter(requete, base)
 
            'charge la table en mémoire
            liaison.Fill(memoire, table)
 
            Dim vue As New DataView(memoire.Tables(table))
            DataGridViewName.DataSource = vue
            cnx.Close()
 
        Catch ex As Exception
            MessageBox.Show(ex.Message, Me.Text)
        End Try
    End Sub
 
puis je modifie mon datagrid...et j'appuis sur mon bouton "OK"...et rien ne se passe...

Reply

Marsh Posté le 19-07-2005 à 19:33:25    

Désolé mais je comprend pas ce que tu fait
 
Si tu fait comme il dise sur la page http://plasserre.developpez.com/v6-5.htm
dans les rubriques que j'ai déjà citer dans mes postes précedents (Ouverture et Modifier un enregistrement)
 
-> il y a un dataset et non un dataview
 
-> la requete il la transmet à un objet OleDbCommand et non à un OleDbDataAdapter
 
-> Ce code doit être mis dans le code de chargement et non celui de validation

Code :
  1. DataGrid1.SetDataBinding(memoire, "Couple" )


 
etc...


Message édité par ricil78 le 19-07-2005 à 19:33:48
Reply

Marsh Posté le 20-07-2005 à 10:05:58    

En fait ce que j'ai fais semble être la même chose (c'est issue d'une source". Ayant le doute j'ai fait comme tu m'as dis mais j'ai encore la même erreur! erreur de syntaxe dans l'instruction insert into!!!!
 
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
   
        Try
            ' Extraire l'enregistrement courant
            ObjetDataRow = ObjetDataSet.Tables("Couple" ).Rows(2)
 
            'Modifier les valeurs des champs en  récupérant le contenu des TextBox
            ObjetDataRow("Nom couple" ) = "tata"
            ObjetDataRow("Abscisse" ) = "titititit"
 
            'Pour modifier les valeurs changées dans le DataAdapter
            ObjetCommandBuilder = New OleDbCommandBuilder(ObjetDataAdapter)
 
            'Mise à jour
            ObjetDataAdapter.Update(ObjetDataSet, "Couple" )
 
            'On vide le DataSet et on le 'recharge' de nouveau.
            ObjetDataSet.Clear()
            ObjetDataAdapter.Fill(ObjetDataSet, "Couple" )
            ObjetDataTable = ObjetDataSet.Tables("Couple" )
 
        Catch ex As Exception
            MessageBox.Show(ex.Message, Me.Text)
        End Try
    End Sub
 
 
chargement avec la methode suivante :
Private Sub taffichageDBCouple(ByVal requete As String, ByVal table As String, ByVal DataGridViewName As DataGrid)
        Try
            ObjetDataSet = memoire
 
            ''Initialisation de la chaîne de paramètres pour la connexion
            strConn = "Provider=" + BdProvider + ";" & "Data Source= " + BdPathDirectory + ";"
 
            'Initialisation de la chaîne contenant l'instruction SQL
            strSql = requete
 
            'Instanciation d'un Objet Connexion
            ObjetConnection = New OleDbConnection()
 
            'Donner à la propriété ConnectionString les paramètres de connexion
            ObjetConnection.ConnectionString = strConn
 
            'Ouvrir la connexion
            ObjetConnection.Open()
 
            'Instancer un objet Commande
            ObjetCommand = New OleDbCommand(strSql)
 
            'Instancer un objet Adapter
            ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
 
            'initialiser l'objet Command
            ObjetCommand.Connection() = ObjetConnection
 
            'Avec l'aide de la propriété Fill du DataAdapter charger le DataSet
            ObjetDataAdapter.Fill(ObjetDataSet, "Couple" )
 
            'Mettre dans un Objet DataTable une table du DataSet
            ObjetDataTable = ObjetDataSet.Tables("Couple" )
 
            DataGridViewName.SetDataBinding(ObjetDataSet, "Couple" )
 
        Catch ex As Exception
            MessageBox.Show(ex.Message, Me.Text)
        End Try
    End Sub

Reply

Marsh Posté le 20-07-2005 à 10:07:39    

Et elle a quelle gueule ta requête ? :heink:

Reply

Marsh Posté le 20-07-2005 à 10:07:39   

Reply

Marsh Posté le 20-07-2005 à 10:18:05    

Le truc c'est qu'il n'y a pas d'instruction insert into.
 
Pour aller plus vite voici mon code, Si l'utilisateur rajoute une ligne, Supprime, modifie.
Un clic sur le bouton enregistrer et le tour est joué.
 
voici mon code abréger:
 
Chargement :

Code :
  1. 'Te passe les détails de la connexion
  2.            'Paramètre la requete récupère les nom de fichiers
  3.             With MyDbCommand
  4.                 .Connection = TonObjetConnexion
  5.                 .CommandType = CommandType.Text
  6.                 .CommandText = "ICI TA REQUETE D'AFFICHAGE (SELECT...)"
  7.             End With
  8.             'Instancer un objet Adapter
  9.             MyDbDataAdapter = New OleDbDataAdapter(MyDbCommand)
  10.             'Avec l'aide de la propriété Fill du DataAdapter charger le DataSet
  11.             MyDbDataAdapter.Fill(MyDataSet, "MA_TABLE" )
  12.             'Mettre dans un Objet DataTable une table du DataSet
  13.             MyDataTable = MyDataSet.Tables("MA_TABLE" )
  14.             UnDataGrid.SetDataBinding(MyDataSet, "MA_TABLE" )


 
Bouton "Enregistement des modifications" :  
 

Code :
  1. 'Pour modifier les valeurs changées dans le DataAdapter
  2.             MyDbCommandBuilder = New OleDbCommandBuilder(MyDbDataAdapter)
  3.             'Mise à jour
  4.             MyDbDataAdapter.Update(MyDataSet, "MA_TABLE" )
  5.             'On vide le DataSet et on le 'recharge' de nouveau.
  6.             MyDataSet.Clear()
  7.             'Remplit le dataset
  8.             MyDbDataAdapter.Fill(MyDataSet, "MA_TABLE" )
  9.             MyDataTable = MyDataSet.Tables("MA_TABLE" )


 
Tiens moi au courant
 
 bye

Reply

Marsh Posté le 20-07-2005 à 10:19:27    

Je crois qu'on va faire un tutorial complet, parce qu'on n'est pas sortir de l'auberge là :(
 
Va falloir aborder les DbCommand avec les Parameters, et le principe de DataSet/DataAdapter...

Reply

Marsh Posté le 20-07-2005 à 10:25:19    

Voila ma requête (lors du chargement du formulaire)
taffichageDBCouple("SELECT Couple.[Nom couple], Couple.Abscisse FROM Couple", "Couple", DataGrid1)

Reply

Marsh Posté le 20-07-2005 à 10:28:21    

Nan, j'veux dire pour le DataAdapter, il lui faut des requêtes paramétrées pour la mise à jour (insert, update et delete)

Reply

Marsh Posté le 20-07-2005 à 10:38:14    

t'es surde toi? c'est pas justement le principe des lignes suivantes :
'Pour modifier les valeurs changées dans le DataAdapter  
            MyDbCommandBuilder = New OleDbCommandBuilder(MyDbDataAdapter)  
 
            'Mise à jour  
            MyDbDataAdapter.Update(MyDataSet, "MA_TABLE" )  
 

Reply

Marsh Posté le 20-07-2005 à 10:58:42    

Ah si merde pardon, il va prendre tout seul les commandes via le command builder :)

Reply

Marsh Posté le 20-07-2005 à 11:03:31    

(mais ca marche pas!;-) )

Reply

Marsh Posté le 20-07-2005 à 11:14:32    

C'est quoi l'exception exacte ?

Reply

Marsh Posté le 20-07-2005 à 11:44:57    

"erreur de syntaxe dans l'instruction insert into"

Reply

Marsh Posté le 20-07-2005 à 12:50:59    

Envoi la requête insert

Reply

Marsh Posté le 20-07-2005 à 14:13:21    

justement c'est ca le problème.  
ce n'est pas moi qui gère les insert into,update, delete...c'est command builder...
je ne sais vraiment pas comment faire! VB/microsoft n'est pas tres avare d'exemple a ce sujet!....En attendant une aide j'essaye de faire a la mano des requetes pour supprimer/modifier/insérer des enregistrement dans ma base. C'est super long a faire...j'imagine déjà la taille du prog finale!

Reply

Marsh Posté le 20-07-2005 à 14:14:30    

Ben balance-la quand-même. Indice : un p'tit espion sur le command builder ;)

Reply

Marsh Posté le 20-07-2005 à 14:40:01    

que se soit insertcommand, delete command, update command...tout est a Nothing

Reply

Marsh Posté le 20-07-2005 à 14:40:34    

apart command text qui est a "SELECT Couple.[Nom couple], Couple.Abscisse FROM Couple"

Reply

Marsh Posté le 20-07-2005 à 14:46:55    

Par contre je viens de remarquer que la propriété DataAdaptateur/TablesMappinp/item a un ! rouge et sa valeure est "impossible d'afficher la propriété indexéé". je ne sais pas si c'est important

Reply

Marsh Posté le 20-07-2005 à 15:09:39    

joe361 a écrit :

que se soit insertcommand, delete command, update command...tout est a Nothing


Met-le sur le command builder, mais espionne par exemple la méthode GetInsertCommand()

Reply

Marsh Posté le 20-07-2005 à 16:08:21    

"Met-le sur le command builder, mais espionne par exemple la méthode GetInsertCommand()"...c'est a dire?
 
j'ai même rajouter la ligne insertCommand...mais les valeurs de l'espion ne change pas
'Pour modifier les valeurs changées dans le DataAdapter
            ObjetCommandBuilder = New OleDbCommandBuilder(ObjetDataAdapter)
 
            'Mise à jour
            ObjetDataAdapter.InsertCommand = ObjetCommandBuilder.GetInsertCommand
            ObjetDataAdapter.Update(memoire, "Couple" )
Par contre je ne sais passi c'est normal mais le champs ObjetDataAdapter/defaultSourceTableName est égale a "Table"

Reply

Marsh Posté le 20-07-2005 à 16:09:24    

Espionne le résultat de la méthode GetInsertCommand du command builder : tu verra ta requête INSERT ;)

Reply

Marsh Posté le 20-07-2005 à 16:36:57    

RESULTAT : NOTHING

Reply

Marsh Posté le 20-07-2005 à 16:38:02    

*ouch* T'as bien mis l'espion àprès que le machin ait été créé, genre sur la ligne suivante ?

Reply

Marsh Posté le 20-07-2005 à 16:51:22    

oui

Reply

Marsh Posté le 20-07-2005 à 18:29:52    

Un peu de disgression,mais pas tant que ca! Avez vous une idée sur une erreur de requête :
Dim req2 = "UPDATE [Espacement couple] SET [Du couple]= '" + duCouple + "'  SET [Au couple]='" + auCouple + "'  SET [Espacement]='" + espacement + "' WHERE [Du couple]='" + duCouple + "'"
me donne l'erreure suivante :
                    "erreur de syntaxe (operateur absent) dans l'expression "0' SET [Au couple]='5' SET [Espacement] ='1".

Reply

Marsh Posté le 21-07-2005 à 10:26:58    

Déjà, en .NET, on n'utilise jamais une simple concaténation pour faire une requête. On utilise toujours des requêtes paramétrées

Reply

Marsh Posté le 26-07-2005 à 16:39:59    

mon code marche pour l'instant, mais j'aimerais bien savoir pour mes futurs développement ce qu'est une requête paramétrée?

Reply

Marsh Posté le 27-07-2005 à 16:10:29    

Ah toi de le découvrir dans la MSDN ;)

Reply

Marsh Posté le 28-07-2005 à 11:40:13    

J'ai un autre petit pb avec une requète...si quelqu'un a une idée :
 
 
Dim req1 = "INSERT INTO [Support longi] ( [Nom support longi],[Type], [codeT panneau]) VALUES ('" & nomSupportLongi & "','" & typeSupportLongi & "','" & codeSupportLongi & "') "
 
cnxClasse.executionRequete(req1)
 
Mais vb me dit :
"Vous ne pouvez pas ajouter ou modifier un enregistrement car l'enregistrement associé est requis dans la table'Panneau'
 
J'ai donc regardé la liaison des tables (access),  en effet 'Nom Panneau' est la clef de la table panneau et [codeT panneau] est le champ  receptionnant cette clef dans ma table [Support longi] (liaison 1-n).
 
Comment puis je faire pour résoudre ce problème le plus simplement possible?
Cordialement,
 

Reply

Marsh Posté le 28-07-2005 à 11:41:02    

Faut d'abord insérer dans la table Panneau, puis dans Support longi

Reply

Marsh Posté le 28-07-2005 à 12:27:03    

Pourtant j'ai déjà un enregistrement "TOTO" clef primaire dans la table panneau....mais j'arrive pas a insérer un enregistrement dans support longi ou la clef étrangère  [codeT panneau] est "TOTO"

Reply

Marsh Posté le 28-07-2005 à 12:53:51    

ok, ca marche!

Reply

Marsh Posté le 28-07-2005 à 17:32:12    

Re-salut FlorentG!
J'ai un ptit problème avec mon datagrid, j'utilisais avant un dataset et j'arrivais a supprimer facilement les lignes. Mais comment fait on si on n'a pas de dataset et juste un datagrid!
 For i = 0 To DataGridGeometrie.Rows.Count - 2
            line.SetValues(i)  
            DataGridGeometrie.Rows.Remove(line)  
        Next i
 
apparament il n'a rrive pas bien a instancier ligne...
si t'as une idée, je suis preneur!
Encore merci

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed