Affichage et actualisation d'une base de donnée

Affichage et actualisation d'une base de donnée - SQL/NoSQL - Programmation

Marsh Posté le 12-04-2012 à 11:10:54    

Bonjours à tous,
 
Tout d'abord je précise que je n'ai presque aucune connaissance en programmation, et que malgré plusieurs tutoriaux suivis sur internet, je n'arrive pas à résoudre mon problème.
Dans le cadre d'un projet pour mes études, je dois créer un programme avec Visual Basic.Net qui affiche le contenu d'une base de donnée (j'utilise Access 2010 pour la créer) dans une fenêtre.
Pour cela j'ai donc créé un "Dataset" qui semble charger la base de donnée à l'ouverture du programme et qui permet ensuite de l'afficher dans un "datagridview". Pour l'instant, je ne comprends pas vraiment ce que je viens de faire, mais ça fonctionne, le contenu s'affiche, hourrah !
 
Maintenant, les données de la base de donnée étant mise à jour régulièrement, il est nécessaire que l'affichage s'actualise et tienne compte des modifications effectuées à la base de donnée avec le temps. Et là, c'est le drame...
J'ai tout d'abord essayé toutes les fonctions update ou refresh que je pouvais trouver sous visual basic en les déclenchant à tout les ticks d'un timer, sans succès...Si des modifications sont faites à la base de donnée originale, elles ne seront prises en compte que lorsque le programme est fermé et relancé...
 
Après plusieurs recherches,  j'apprends qu'il est nécessaire de faire une requête SQL pour que la mise à jour se fasse...Jusqu'à présent, je n'ai pas utilisé de SQL ni quoi que ce soit de tel...
Pour cela il faudrait donc un serveur SQL relié à la base de donnée et à Visual Basic qui me permette de faire cette fameuse requête...
 
Malheureusement, même en ayant pu réunir ces divers éléments du puzzle, je n'arrive toujours pas à mes fins, et ce malgré plusieurs tutoriaux explicatifs (ces derniers étant souvent beaucoup plus généraux, je ne comprends pas ce que je dois faire concrètement pour résoudre mon problème précis, ou alors certains codes "tout faits" ne fonctionnent pas pour je ne sais quelle raison, et je n'ai pas le temps d'apprendre tout le fonctionnement du SQL, surtout que je n'ai besoin "que" de mettre à jour l'affichage de ma base de donnée, ce qui me semblait simpliste en apparence).
De plus, je suis assez pressé puisque je dois être capable de faire cela pour la semaine prochaine..
 
Maintenant, je serais éternellement reconnaissant envers celui qui saurait me consacrer un peu de son temps pour m'aider à résoudre mon problème, qui n'a pas l'air très compliqué pour celui qui s'y connait... Je ne dis pas qu'il me sauverait la vie, mais c''est presque ça =)
 
D'avance merci !
 
ps : Si par bonheur il vous advenait l'envie de me venir en aide, n'hésitez pas à m'envoyer un message pour plus de précision si jamais je n'avais pas été suffisamment précis, comme vous l'aurez compris, j'ai vraiment besoin d'aide actuellement !

Reply

Marsh Posté le 12-04-2012 à 11:10:54   

Reply

Marsh Posté le 12-04-2012 à 13:15:11    

J'imagine que tu comptais rémunérer cette aide?
 
Sinon, pour info, Access, ce n'est pas un sgbd, c'est juste bon à gérer qq données en local. Si tu veux faire une appli reposant sur une BD, t'as Mysql et postGre comme SGBD gratuits. La version express de MSSQL est aussi gratuite.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-04-2012 à 10:43:47    

A vrai dire j'ose espérer une aide bénévole :P
 
Je sais même pas si j'ai vraiment besoin d'un sgbd, à vrai dire j'ai mis le tag un peu sans savoir dans quelle catégorie je me trouve.
Tout ce que je veux faire, c'est afficher la base de donné access sur visual basic dans un datagridview (ça j'y arrive)  et actualiser le datagridview si les données de la base de donnée ont changé...Je ne sais même pas si j'ai besoin de Mysql ou autre pour faire ça, tout ce que je veux c'est que ça fonctionne :(

Reply

Marsh Posté le 13-04-2012 à 12:03:46    

Règles du forum : ici, on ne fait pas le boulot à la place de qq'un. Soit tu fais le boulot, dans ce cas, tu postes ton code en disant où tu bloques et tu trouveras de l'aide. Ca te demandera des efforts et du temps.
 
Soit tu le fais faire par qq'un d'autre, ça sera plus facile, plus rapide sans doute, mais ne soit pas étonné qu'il te demande des sous... :o


Message édité par rufo le 13-04-2012 à 12:05:06

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-04-2012 à 08:35:52    

Je ne demande pas qu'on me fasse mon travail, je demande une marche à suivre pour que je puisse continuer à travailler.
Enfin, sinon voilà une partie de la partie de mon code ou je bloque :
 
    Private Sub Affichage_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Database11.accdb"
        ObjetConnection = New OleDbConnection
        ObjetConnection.ConnectionString = strConn
        ObjetConnection.Open()
        If ObjetConnection.State = 1 Then
            MsgBox("Connexion Reussie" )
        End If
 
 
 
        strSql = "SELECT * FROM matable"
        ObjetCommand = New OleDbCommand(strSql)
        ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
        ObjetCommand.Connection() = ObjetConnection
        ObjetDataAdapter.Fill(Database11DataSet, "matable" )
 
        DataGridView1.DataSource = Database11DataSet.Tables("matable" )
 
        TIM_CHRONO.Start()
    End Sub
 
 
 
  Private Sub TIM_CHRONO_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_CHRONO.Tick
 
        ObjetDataAdapter.Update(Database11DataSet, "matable" ) 'plein de lignes dont je connais pas l'utilité mais qui me semblaient pouvoir recharger le dataset...
        Database11DataSet.Clear()
        ObjetDataAdapter.Fill(Database11DataSet, "matable" )
        ObjetDataTable = Database11DataSet.Tables("matable" )
        DataGridView1.Update()
        DataGridView1.DataSource = Database11DataSet.Tables("matable" )
 
 
        strSql = "SELECT * FROM matable"
        ObjetCommand = New OleDbCommand(strSql)
        ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
        ObjetCommand.Connection() = ObjetConnection
        ObjetDataAdapter.Fill(Database11DataSet, "matable" )
 
        DataGridView1.DataSource = Database11DataSet.Tables("matable" )
        DataGridView1.Refresh()
        DataGridView1.Update()
 
    End Sub
 
 
Et donc, comme je dis, je voudrais qu'à chaque Tick du chrono, le datagridview affiche la version la plus récente de la table "matable" de la base de donnée "database11" qui a été modifiée depuis le lancement du programme, mais je ne comprends pas (et je n'ai pas vraiment le temps de comprendre d'ailleurs =/) le fonctionnement exact de chacune des fonctions que j'utilise, ce qui rend la tâche assez compliquée...

Reply

Marsh Posté le 14-04-2012 à 15:26:22    

Ton chrono, il va à quelle fréquence? Parce que s'il va trop vite et que ta BD est grosse, tu risques de saturer Access : il aura pas le temps de t'envoyer les données qu'une nouvelle requête sera arrivée.
 
Au fait, comment les données de ta BD Access peuvent changer si tu l'ouvres avec ton appli? J'en étais resté que Sous Access 2000, on ne pouvait avoir qu'une ou 2 connexions simultanées.
 
Sinon, t'as testé que ton chrono marche? Si tu vires tout ce que t'as mis dans TIM_CHRONO_Tick et que tu fais juste un MsgBox "OK", le message s'affiche à la bonne fréquence?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-04-2012 à 15:34:30    

ObjetConnection devrait être une variable globale pour être accessible dans toutes tes fonctions.
 
Une fois que t'auras vérifier que le chrono marche, dans TIM_CHRONO_Tick, je virais tout et je mettrais :

Code :
  1. Database11DataSet.Clear()
  2. strSql = "SELECT * FROM matable"
  3. ObjetCommand = New OleDbCommand(strSql)
  4. ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
  5. ObjetCommand.Connection() = ObjetConnection
  6. ObjetDataAdapter.Fill(Database11DataSet, "matable" )
  7.  
  8. DataGridView1.DataSource = Database11DataSet.Tables("matable" )


 
Y'a quand même un truc qui me chagrine, c'est la manière dont est ouverte ta BD Access. Access a pas été prévu pour des accès concurrentiels, du coup, comment on peut ouvrir ta BD en écriture d'un côté et en lecture par ton appli pour voir les modifs apportées aux données :??: J'ai bien peur que quand t'ouvres ta BD avec ton appli, tu ne vois les données telles qu'elles sont au moment de l'ouverture. Pour voir les modifs, il faudrait peut-être refermer la BD et la réouvrir...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-04-2012 à 20:53:51    

Ben, le chrono fonctionne de ce côté là j'ai pas de soucis non :/
Pour faire une variable globale il sufift de mettre public hein ?  
Enfin, même avec ton code et avec ça, ça ne fonctionne pas :(
 
Par contre tu me fais peur avec cette histoire de données de la bdd qu'on ne verra qu'au moment de l'ouverture, car ça revenait parfois sur le net, mais je me disais que si il est possible de la charger à l'ouverture du programme il devrait être possible de la recharger plus tard non? :( Y-aurait quand même moyen de le faire?
 
Enfin, je n'y comprends rien ça me désespère ='(
 
En tout cas merci de m'aider ! :)

Reply

Marsh Posté le 14-04-2012 à 22:46:33    

ben, suffit à chaque fois, d'ouvrir la BD, faire la requête et la refermer. Pour info, c'est souvent comme ça que fonctionne les applis web en php ou asp telles que ce forum.
 
Après, il est possible de faire des connexions persistantes (pool de connexions). Mais franchement, si tu veux faire une appli client serveur ou du moins faire du multi-users (ie accès simultanés), faut prendre un vrai sgbd, pas cette bouse d'Access :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-04-2012 à 11:44:04    

Et comment je pourrais coder ça ? Je devrais le faire manuellement ? car le but c'est que ça soit automatique ^_^
Même si c'est une solution pas très propre, tant que ça peut fonctionner automatiquement, ça me suffit  en fait, si je pouvais éviter d'avoir à apprendre tout le fonctionnement d'un sgbd, ça m'arrangerait bien (enfin, plus exactement, je ne pense pas que j'aurai le temps de faire ça, pas du tout même :O ) mais c'est bien la question que je me pose, comment réouvrir la bd et faire cette fameuse requête...

Reply

Marsh Posté le 15-04-2012 à 11:44:04   

Reply

Marsh Posté le 15-04-2012 à 18:06:07    

Ben t'ouvre ta connexion à la BD de la même manière que tu l'ouvres au début de ton appli : ObjetConnection.Open()  
Mais avant d'ouvrir la connexion, faut penser à la refermer.
 
Et pour info, quand on veut créer un programme, ben faut apprendre un minium les technos qu'on manipule :/ Quand tu fais du bricolage, t'apprends bien les bases pour faire qq chose qui tienne la route. Ben en informatique, c'est pareil, ça vient pas comme ça...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-04-2012 à 18:50:31    

Donc dans le timer, avant les lignes que j'ai déjà mis, je mettrais juste :
ObjetConnection.Close()
ObjetConnection.Open()
 
et ça devrait marcher ?
Car en faisant ça, ça ne fonctionne toujours pas =(
Je sais bien que mon entreprise est foireuse mais bon... J'ai vraiment besoin que ça fonctionne, et uniquement besoin de ça, j'ai pas du tout pour ambition d'être un programmeur hors pair ou quoi =/

Reply

Marsh Posté le 16-04-2012 à 09:14:07    

Non, en mettant ça, en partant du principe que ObjetConnection est une variable globale :

Code :
  1. ObjetConnection.Close()
  2. ObjetConnection.Open()
  3. If ObjetConnection.State = 1 Then
  4.        MsgBox("Connexion Reussie" )
  5.      
  6.        strSql = "SELECT * FROM matable"
  7.        ObjetCommand = New OleDbCommand(strSql)
  8.        ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
  9.        ObjetCommand.Connection() = ObjetConnection
  10.        ObjetDataAdapter.Fill(Database11DataSet, "matable" )
  11.  
  12.        DataGridView1.DataSource = Database11DataSet.Tables("matable" )
  13. End If


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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