Deeddolith
Messages postés20Date d'inscriptionjeudi 24 novembre 2005StatutMembreDernière intervention 4 octobre 2008
-
27 sept. 2008 à 01:54
Deeddolith
Messages postés20Date d'inscriptionjeudi 24 novembre 2005StatutMembreDerniè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).
Deeddolith
Messages postés20Date d'inscriptionjeudi 24 novembre 2005StatutMembreDerniè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
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.
68manu
Messages postés43Date d'inscriptionsamedi 20 septembre 2008StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Deeddolith
Messages postés20Date d'inscriptionjeudi 24 novembre 2005StatutMembreDerniè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"