Résolu Vb net, mise à jour de la bdd access

Solutions (18)
Tags :
  • Mise à jour
  • Visual studio
  • Programmation
|
Bonjour à tous et à toutes.
Je suis actuellement en stage de deuxième année pour mon dut informatique.
Mon projet consiste à modifier une base de donnée access via Vb.net sous visual studio.
Je suis débutant dans se qui est du rapport bdd/Vb.net.
En suivant un tuto j'ai réussi à me connecter à la base de donnée, à lire des informations...
J'utilise la méthode OleDb, j'ai lu que se n'était pas forcement la meilleur, mais c'est celle que j'ai le mieux compris.

Je suis à la partie où je dois effectuer des modification dans la bdd.
J'utilise le dataadapter, et les changements s'effectuent très bien dans le dataset quand je lis les lignes où sont effectués ces changements.

Problème : les changements ne s'effectuent pas dans la base de donnée access...
Cela fais 4 jours que j'essaye mais je n'avance pas.

Mon code :

  1. 'CONNECTION
  2.  
  3. cnxstr = "provider = microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\base de données connection.mdb;"
  4. cnx = New OleDbConnection
  5. cnx.ConnectionString = cnxstr
  6. cnx.Open()
  7.  
  8.  
  9. 'Création de la requête sql
  10. sql = "select * from Company"
  11.  
  12. 'Création de la commande et on l'instancie (sql)
  13. cmd = New OleDbCommand(sql)
  14.  
  15. 'Création du dataadapter (dta) et on l'instancie (cmd)
  16. dta = New OleDbDataAdapter(cmd)
  17.  
  18. 'On instancie la commande (cmd) à la connection (cnx)
  19. cmd.Connection() = cnx
  20.  
  21. 'On charge le dataset (dts) grace à la propriété fill du dataadapter (dta)
  22. dta.Fill(dts, "Company")
  23.  
  24. 'On charge la datatable (dtt) grace à la propriété tables du dataset (dts)
  25. dtt = dts.Tables("Company")
  26.  
  27.  
  28. 'MODIFICATIONS
  29.  
  30. dtr = dts.Tables("Company").NewRow
  31. dtr("CompanyNumber") = NumberBox.Text
  32. dtr("CompanyName") = NameBox.Text
  33.  
  34.  
  35. 'ajout de la ligne dans le DataSet
  36. dts.Tables("Company").Rows.Add(dtr("CompanyNumber"), dtr("CompanyName"))
  37.  
  38.  
  39.  
  40. 'création et exécution du commandbuilder pour mettre à jour le DataAdapter
  41. cmdb = New OleDbCommandBuilder(dta)
  42.  
  43.  
  44. 'mise à jour des données du dataadapter(dta)à partir du commandbuilder (cmdb)
  45.  
  46. dta.Update(dts, "Company")
  47.  
  48.  
  49. 'on vide le dataset pour le recréer avec les nouvelles données
  50. dts.Clear()
  51. dta.Fill(dts, "Company")
  52.  
  53. dtt = dts.Tables("Company")
  54.  
  55.  
  56.  
  57. cnx.Close()
  58. dta.Dispose()


Voilà, si quelqu'un à une solution ou même un indice, je suis preneur.
Merci d'avance.
Contenus similaires
Meilleure solution
partage
, Modérateur |
je viens d'essayer avec ce code et ça fonctionne :
  1. private static void EditData()
  2. {
  3. string connstr = @"provider = microsoft.jet.oledb.4.0 ; data source = C:\Users\OmaR\Desktop\Database1.mdb;";
  4. OleDbConnection myconn = new OleDbConnection(connstr);
  5. DataSet ds = new DataSet();
  6. OleDbDataAdapter myadpt = new OleDbDataAdapter("select * from Contacts", myconn);
  7. myadpt.Fill(ds, "Contacts");
  8.  
  9. ds.Tables["Contacts"].Rows[1]["FirstName"] = "modified name";
  10.  
  11. OleDbCommandBuilder scb = new OleDbCommandBuilder(myadpt);
  12. myadpt.UpdateCommand = scb.GetUpdateCommand();
  13. myadpt.Update(ds, "Contacts");
  14. }


(Désolé, c'est du C#, mais c'est équivalent en VB.Net)
  • Commenter cette solution |
Score
1
òh
òi
|
Meilleure réponse sélectionnée par Das90.
  • Commenter cette réponse |
Score
0
òh
òi
|
RedSux a dit :
Il ne t'a jamais dis que c'était gratuit, tu recevras bientôt une facture à régler dans les plus brefs délais :o 

ps: it's a joke




^^ Oui, merci a toi aussi, tu m'as fais réviser le sql ! merci !
  • Commenter cette réponse |
Score
0
òh
òi
|
Das90 a dit :
En tout cas merci à toi Omar, ça fais super plaisir de voir qu'il y a des gens comme toi qui viennent en aide gratuitement ! merci


Il ne t'a jamais dis que c'était gratuit, tu recevras bientôt une facture à régler dans les plus brefs délais :o 

ps: it's a joke
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Pas de problème :) 
  • Commenter cette réponse |
Score
0
òh
òi
|
C'est bon ! mon problème est résolu. Une erreur dont je ne suis pas fière ^^. Jai remarqué que dans ton code tu allais chercher ta database avec son chemin (normal ^^) et que dans le mien j'allais chercher ça : " & Application.StartupPath & "\base de données connection.mdb;" ce que j'avais recopier du tuto. Mais je pense que ce chemin correspond au dataset, donc au finale je n'étais même pas connecté à ma vrai base de donnée. En tout cas merci à toi Omar, ça fais super plaisir de voir qu'il y a des gens comme toi qui viennent en aide gratuitement ! merci
  • Commenter cette réponse |
Score
0
òh
òi
|
Je n'avais pas très bien compris. Dans la partie connection, c'est bien ça?
  1. Public Sub AddCompany_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2. MenuServer.Close()
  3.  
  4. cnxstr = "provider = microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\base de données connection.mdb;"
  5. cnx = New OleDbConnection
  6. cnx.ConnectionString = cnxstr
  7. cnx.Open()
  8.  
  9. 'Création de la requête sql
  10. sql = "select * from Company"
  11. 'Création de la commande et on l'instancie (sql)
  12. cmd = New OleDbCommand(sql)
  13. 'Création du dataadapter (dta) et on l'instancie (cmd)
  14. dta = New OleDbDataAdapter(cmd)
  15. 'On instancie la commande (cmd) à la connection (cnx)
  16. cmd.Connection() = cnx
  17.  
  18.  
  19.  
  20. cmdb = New OleDbCommandBuilder(dta)
  21.  
  22.  
  23.  
  24.  
  25. 'On charge le dataset (dts) grace à la propriété fill du dataadapter (dta)
  26. dta.Fill(dts, "Company")
  27. 'On charge la datatable (dtt) grace à la propriété tables du dataset (dts)
  28. dtt = dts.Tables("Company")


Je viens de l'ajouté comme ça, et j'ai supprimé l'autre mais rien ne se passe. A la fin de mon programme je lis la dernière ligne de ma table, et elle correspond à se que je viens d'ajouté. Mais quand j'arrête le programme dans la base de donnée rien ne se passe...
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Tu n'as pas tout fait ce que je t'ai dit.
Je t'ai dit de passer la création OleDbCommandBuilder avant de faire le Fill. Parce que si tu l'initializes après, j'imagine qu'il prend en compte l'état actuel de la base, et donc, rien n'a changé, vu que les changements ont été fait avant la création du OleDbCommandBuilder.
  • Commenter cette réponse |
Score
0
òh
òi
|
Avec vos réponses j'ai deux codes différents

un avec commandbuilder :
  1. dtr = dts.Tables("Company").NewRow
  2. dtr("CompanyNumber") = NumberBox.Text
  3. dtr("CompanyName") = NameBox.Text
  4.  
  5.  
  6. 'ajout de la ligne dans le DataSet
  7. dts.Tables("Company").Rows.Add(dtr("CompanyNumber"), dtr("CompanyName"), "", 1, "03/11/2008 00:01:00")
  8.  
  9.  
  10. cmdb = New OleDbCommandBuilder(dta)
  11. 'création et exécution du commandbuilder pour mettre à jour le DataAdapter
  12.  
  13. cmdb.GetUpdateCommand()
  14.  
  15. 'mise à jour des données du dataadapter(dta)à partir du commandbuilder (cmdb)
  16.  
  17. dta.Update(dts, "Company")
  18.  
  19.  
  20. 'on vide le dataset pour le recréer avec les nouvelles données
  21. dts.Clear()
  22.  
  23. dta.Fill(dts, "Company")
  24.  
  25. dtt = dts.Tables("Company")
  26.  
  27.  
  28.  
  29. cnx.Close()
  30. dta.Dispose()


et l'autre avec le sql, mais il me semble qu'avec le commandbuilder, pas besoin de passer par des requêtes sql donc le problème ne doit pas venir de la.

  1. 'j'ai essayer de deux façons différentes en sql
  2.  
  3. ' Dim oCommand As New OleDbCommand("insert into Company(CompanyNumber) Values (10)", cnx)
  4. 'oCommand.ExecuteNonQuery()
  5.  
  6.  
  7. cmd.CommandText = "UPDATE Company SET CompanyNumber = [10], CompanyName = [Yo] WHERE id = [5]"
  8. cmd.ExecuteNonQuery()
  9.  
  10.  
  11. dta.Update(dts, "Company")
  12. dts.Clear()
  13. dta.Fill(dts, "Company")
  14.  
  15. dtt = dts.Tables("Company")
  16. MsgBox(dtt.Rows(5).Item("CompanyNumber"))
  17.  
  18. cnx.Close()


Voila, mais toujours le même résultat.
(je n'ai pas mis le code de connexion car il n'a pas changé)
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Fais voir ton code maintenant :) 
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonjours et merci pour vos réponses.
J'ai essayer tout se que vous m'avez dit, mais rien a faire, seul le dataset subis les modifications. Je ne comprend pas... Je vois que le data adapter sert de relai entre le dataset et la database si j'ai bien compris, je fais un update sur le dataadapter (dta) mais ça ne fonctionne pas...
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
En fait je me suis trompé, il y a bien le code pour recopier les données vers access, vu que tu as un Update.
Essaie de créer ton OleDbCommandBuilder avant de faire un Fill. Puis juste avant le Update, fais un cmdb.GetUpdateCommand()


Edit: merde j'avais cet onglet ouvert depuis quelques heures, j'avais pas vu que y'avait des réponses entre temps :D 

Edit 2 : et normalement, pas besoin de faire d'UPDATE manuel. En utilisant un OleDbCommandBuilder, il se débrouille pour générer les requêtes SQL d'Update ou Insert tout seul en fonction de la database.
  • Commenter cette réponse |
Score
0
òh
òi
|
Oups, tu as pas forcément vue mon rajout pour 'ADODB.Command'...

Pour information, la modification de champs en SQL :
Citation :
UPDATE "nom de table"
SET colonne 1 = [valeur 1], colonne 2 = [valeur 2]
WHERE {condition}


Et l'object 'ADODB.Command' permet d'exécuter ce genre de requête.

Le 'ADODB.Recordset' permet, quand à lui, d'exécuter les requête à résultat comme les 'SELECT'.
  • Commenter cette réponse |
Score
0
òh
òi
|
OK merci beaucoup, je vais essayer ça !
  • Commenter cette réponse |
Score
0
òh
òi
|
Ce que je fais avec ADOTable (format Delphi, désolé, mais ça doit pas être loin) :

  1. table.TableName := 'nom_de_la_TABLE';
  2. table.Open;
  3. try
  4. table.Edit;
  5. table.Filter := 'ID = '+ID_DU_RECORD_QUE_JE_MODIFIE;
  6. table.FieldByName('CHAMPS_DATETIME').AsDateTime := Now;
  7. table.FieldByName('CHAMPS_STRING').AsString := 'foo';
  8. table.FieldByName('CHAMPS_REEL').AsFloat := 1.3;
  9. table.FieldByName('CHAMPS_INTEGER').AsInteger := 3;
  10. table.FieldByName('CHAMPS_BOOLEAN').AsBoolean := false;
  11. try
  12. table.Post;
  13. Except
  14. on E:Exception do table.Cancel;
  15. end;
  16. finally
  17. table.Close;
  18. end;


Avec ça dans une méthode que j'appelle avec une boucle, je modifie tous mes enregistrements ...

Important : TableName, Insert, Filter et Post... C'est ces 4 méthodes qui définissent Où, Comment, Qui et Quand. Le Quoi c'est les 'FieldByName'.


Si il n'y a pas d'équivalent, essaye avec l'objet command :

  1. Set cmd = New ADODB.Command
  2.  
  3. ...
  4.  
  5. cmd.CommandText = "UPDATE nom_table SET champs = nouvelle_valeur WHERE id = ton_enregistrement"
  6.  
  7. ...
  8.  
  9. Set rst = cmd.Execute


Il me semble que c'est ainsi que ça fonctionne.
  • Commenter cette réponse |
Score
0
òh
òi
|
Salut et merci pour vos réponse.

RedSux, ma méthode fais partie de ADO, j'ai déjà essayé les insert into, mais le problème persiste ... je modifie que le dataset et pas la database...

Omar je pense que tu as bien cerné le problème. Je suis débutant et je ne trouve pas comment recopier les donnée de la datatable vers access... Si tu as une idée la dessus je suis preneur.
  • Commenter cette réponse |
Score
0
òh
òi
|
Il me semble que les composants ADO sont plus pratiques sous Windows ... Un petit lien qui t'aidera peut être : Utilisation de ADO dans VB dotnet.

Après, amuse toi avec les requêtes SQL 'INSERT INTO', 'SELECT', etc...
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Salut,

Si tu veux mettre à jour les données Access, il faut les réinjecter dans Access.
Là tout ce que tu fais c'est de récupérer les données (en les copiant dans une DataTable) et de modifier les données de la DataTable.
Après, il faut recopier les données de la DataTable vers Access.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS