Probleme base access avec vb.net - VB/VBA/VBS - Programmation
Marsh Posté le 19-07-2005 à 11:33:20
Citation : |
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 !
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.
Marsh Posté le 19-07-2005 à 14:52:44
Encore moi !
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 :
|
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 !
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!
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
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...
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 :
|
etc...
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
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 :
|
Bouton "Enregistement des modifications" :
Code :
|
Tiens moi au courant
bye
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...
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)
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)
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" )
Marsh Posté le 20-07-2005 à 10:58:42
Ah si merde pardon, il va prendre tout seul les commandes via le command builder
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!
Marsh Posté le 20-07-2005 à 14:14:30
Ben balance-la quand-même. Indice : un p'tit espion sur le command builder
Marsh Posté le 20-07-2005 à 14:40:01
que se soit insertcommand, delete command, update command...tout est a Nothing
Marsh Posté le 20-07-2005 à 14:40:34
apart command text qui est a "SELECT Couple.[Nom couple], Couple.Abscisse FROM Couple"
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
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()
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"
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
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 ?
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".
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
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?
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,
Marsh Posté le 28-07-2005 à 11:41:02
Faut d'abord insérer dans la table Panneau, puis dans Support longi
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"
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
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