Probleme avec oledb

Résolu
Deeddolith Messages postés 20 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 4 octobre 2008 - 27 sept. 2008 à 01:54
Deeddolith Messages postés 20 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 4 octobre 2008 - 28 sept. 2008 à 19:39
Bonjour,

J'ai un petit soucis avec OLEDB, visiblement mes données ne sont pas toujours synchro avec ma base access.

J'ai une application multi forms, avec laquelle j'interroge une base de donnée access J'appelle des forms supplémentaires en  pour ajouter ou mettre a jours les données du form principal.
Les données de mon form principal sont issues d'un dataset.
J'utilise une fonction qui detruit et recrée les objets oledb pour mettre a jours mes données (paut etre pas la meilleur solution, mais la n'est pas le probleme).

Lorsque, dans un form additionel, j'utilise une requete de type INSERT ou UPDATE ou DELETE en passant par la methode oledb.oledbCommand.executeScalar et appelle la methode pour rafraichir mon form principal, je n'ai pas de problemes.

Par contre, lorsque, dans un form additionel (different de celui pre-cité), je met a jours une ligne a passant par un dataAdapter et appelle la methode pour rafraichir mon form principal, je n'obtient pas les données mises a jour. Pourtant, les données ont bien été écrites dans la base avant l'appelle de la mise a jour (j'ai verifié en mode pas a pas).

Y aurait-il un cache qui traine quelque part ?

5 réponses

Deeddolith Messages postés 20 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 4 octobre 2008
28 sept. 2008 à 19:39
c'est bon, j'ai trouvé.
Dans la procedure requery, j'ai oublié de detruire mon ds !
3
68manu Messages postés 43 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 1 octobre 2008
27 sept. 2008 à 10:47
Salut,
envoies un bout de code, ca sera plus simple pour resoudre cela.
Manu

_____________________
No problems, only soluces
0
Deeddolith Messages postés 20 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 4 octobre 2008
27 sept. 2008 à 12:17
Attention, va y avoir du sport

Dans ma fenetre principale:
Public

Class frm_mob
   'Declaration des variables
   'objets oledb

   Dim cmd
As OleDb.OleDbCommand

   Dim da
As OleDb.OleDbDataAdapter

   Dim ds
As DataSet

   Dim dt
As DataTable

   Dim rowNum
As
Integer

Public

Sub requery()

      Dim strSQL
As
String

      'recupere la requete SQL
      strSQL = cmd.CommandText
      'destruction des objets oledb
      dt.Dispose()
      dt =
Nothing
      da.Dispose()
      da =
Nothing
      cmd.Dispose()
      cmd =
Nothing
      'creation des objets oledb
      cmd =
New OleDb.OleDbCommand(strSQL, cn)
      da =
New OleDb.OleDbDataAdapter(cmd)
      da.FillLoadOption = LoadOption.OverwriteChanges
      da.Fill(ds,
"MOB")
      dt = ds.Tables(
"MOB")
      'mise a jour des controles
      updateControls()

   End
Sub
End Class

Dans ma fenetre de mise a jours:
Public

Class frm_mobsManager
   'Declaration des variables   'mode représente la mise a jour des données, soit ajout (mode "NEW"), soit modification (mode "UPDATE")

   Dim mode
As
String
   'declaration des objets oledb
   Dim cmd
As OleDb.OleDbCommand

   Dim da
As OleDb.OleDbDataAdapter

   Dim ds
As DataSet

   Dim dt
As DataTable

   Dim rowNum
As
Integer
   Dim strSQL
As
String
   Dim cmdb
As OleDb.OleDbCommandBuilder

   Dim dr
As DataRow
   'flux pour mettre a jour un picrurebox

   Dim stream
As IO.MemoryStream

   Private

Sub cmd_ok_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles cmd_ok.Click
      'tableaux d'octets pour gerer les imgages
      'pictureData: données issues de l'images

      Dim pictureData
As
Byte()
      'fieldData otentes OLE + image qui seront ecrit dans la base

      Dim fieldData
As
Byte()
      'cmd qui sert a recuperer maxID, clef primaire

      Dim cmdMob
As OleDb.OleDbCommand

      Dim maxID
As
Integer

      If (txt_nom.Text <>
"")
Then
         txt_nom.BackColor = System.Drawing.SystemColors.Window
         'Mode Nouvelle ligne

         Select
Case mode

            Case
"NEW"
               'Ajour d'une nouvelle ligne au dataset
               dr = ds.Tables(
"MOB").NewRow
               'recuperation de la valeur maxi de la clef primaire
               cmdMob =
New OleDb.OleDbCommand(
"SELECT MAX(ID_MOB) FROM MOB", cn)
               maxID = cmdMob.ExecuteScalar()
               cmdMob.Dispose()
               cmdMob =
Nothing
               'valeur clef primaire
               dr(
"ID_MOB") = maxID + 1
               'colonne TIME_KILLED doit valoir minimum 1
               dr(
"TIME_KILLED") = 1
               ds.Tables(
"MOB").Rows.Add(dr)

            Case
"UPDATE"
               dr = dt.Rows(rowNum)

         End
Select
         'Lecture des valeurs controles et mise a jour de la ligne
         dr(
"NOM") = txt_nom.Text

         If (txt_lvl.Text =
"")
Then
            dr(
"LVL") = DBNull.Value

         Else
            dr(
"LVL") = txt_lvl.Text

         End
If
         If (cmb_type.SelectedIndex = -1)
Then
            dr(
"TYPE") = DBNull.Value

         Else
            dr(
"TYPE") = cmb_typeID.Items(cmb_typeID.SelectedIndex).ToString

         End
If
         If (cmb_class.SelectedIndex = -1)
Then
            dr(
"CLASS") = DBNull.Value

         Else
            dr(
"CLASS") = cmb_classID.Items(cmb_classID.SelectedIndex).ToString

         End
If
         If (txt_comment.Text =
"")
Then
            dr(
"COMMENT") = DBNull.Value

         Else
            dr(
"COMMENT") = txt_comment.Text

         End
If
         If (pic_mob.Image
Is
Nothing)
Then
            'Si aucune image n'est selectionnée, alors on lit une image par defaut, issue de la table SYS_DATA de la base
            cmdMob =
New OleDb.OleDbCommand(
"SELECT NO_PICTURE FROM SYS_DATA", cn)
            dr(
"PICTURE") = cmdMob.ExecuteScalar()
            cmdMob.Dispose()
            cmdMob =
Nothing
         Else
            'Si une image est selectionnée
            'sauvegarde de l'image sur disque
            pic_mob.Image.Save(Application.StartupPath &
"\tmp.bmp", Imaging.ImageFormat.Bmp)
            'lecture de l'image a partir du disque
            pictureData =
My.Computer.FileSystem.ReadAllBytes(Application.StartupPath &
"\tmp.bmp")
            'destruction du fichier temporaire
            Kill(Application.StartupPath &
"\tmp.bmp")
            'preparation des données de l'image + entetes OLE

            ReDim fieldData(0
To OLEheader.Length + pictureData.Length + OLEfooter.Length - 1)
            'ajout des entetes OLE de debut (sauvegardées au demerrage de l'application)
            Array.Copy(OLEheader, fieldData, OLEheader.Length)
            'ajout de l'image
            Array.Copy(pictureData, 0, fieldData, OLEheader.Length, pictureData.Length)
            'ajout des entetes OLE de fin (sauvegardées au demarrage de l'application)
            Array.Copy(OLEfooter, 0, fieldData, OLEheader.Length + pictureData.Length, OLEfooter.Length)
            dr(
"PICTURE") = fieldData

         End
If
         cmdb =
New OleDb.OleDbCommandBuilder(da)
         'mise a jour de la base de donnée
         da.Update(ds,
"MOB")
         'rafraichir les objets oledb
         ds.Clear()
         da.Fill(ds,
"MOB")
         dt = ds.Tables(
"MOB")
         cmdb.Dispose()
         cmdb =
Nothing
         mode =
"NOTHING"
         'mise a jour des controles
         updateControls()
         'mise a jour de la fenettre frm_mob
         frm_mob.requery()

     Else
         txt_nom.BackColor = Color.Red

      End
If
   End
Sub
End Class

J'espere que c'est suffisment clair. (PS: ne vous preoccuper pas trop du traitement de l'image).
Sinon n'hesitez pas a en demander plus.
0
68manu Messages postés 43 Date d'inscription samedi 20 septembre 2008 Statut Membre Dernière intervention 1 octobre 2008
27 sept. 2008 à 15:07
Salut,

excuses moi j'ai mis un peu de temps...
mais il me reste quelque chose de pas clair...
la variable mode est-elle initialisee a un moment donne ?
Car si elle ne l'est pas, tout ton select case n'est pas lu par ton programme.

Pour l'instant j'ai pas mieux.
Je cherche encore
MAnu

_____________________
No problems, only soluces
0

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

Posez votre question
Deeddolith Messages postés 20 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 4 octobre 2008
27 sept. 2008 à 17:07
Oui, elle est initialisée.
Au depart, mode est initialisé a "NOTHING"
Dans ma fenetre j'ai 2 autre  boutons: New et Update
Apres un click sur New, j'initialise mode a "NEW"
Apres un click sur Update, j'initialise mode "UPDATE"

J'ai egalement 2 autre boutons: Ok (dont le code est ci-dessus), et Cancel.
Après un click sur Cancel, j'initialise mode a "NOTHING"
0
Rejoignez-nous